
# 操作步骤
本节将基于透明加密的主要功能场景展开详细说明，包含功能使用方式、结果验证等内容。
#### 表数据加密
1. gsql客户端连接DN主节点，创建明文表tbl、AES算法加密表tbl_aes以及SM4算法加密表tbl_sm4。 
   ```
   gaussdb=# CREATE TABLE tbl (c1 INT, c2 TEXT);
   CREATE TABLE
   gaussdb=# CREATE TABLE tbl_aes (c1 INT, c2 TEXT) WITH (enable_tde = on);
   CREATE TABLE
   gaussdb=# CREATE TABLE tbl_sm4 (c1 INT, c2 TEXT) WITH (enable_tde = on, encrypt_algo = 'SM4_CTR');
   CREATE TABLE
   ```
   
   
2. 查询pg_class表。表tbl_aes与表tbl_sm4中存在透明加密相关表选项。 
   ```
   gaussdb=# SELECT relname,reloptions FROM pg_class WHERE relname LIKE 'tbl%';
    relname | reloptions
   ---------+-----------------------------------------------------------------------------------------------------------------------
    tbl     | {orientation=row,compression=no,storage_type=USTORE,segment=off}
    tbl_aes | {orientation=row,enable_tde=on,compression=no,storage_type=USTORE,segment=off,encrypt_algo=aes_128_ctr,key_type=...}
    tbl_sm4 | {orientation=row,enable_tde=on,compression=no,storage_type=USTORE,segment=off,encrypt_algo=sm4_ctr,key_type=...}
   (3 rows)
   ```
   
   
3. 向三张表插入数据。 
   ```
   gaussdb=# INSERT INTO tbl VALUES (generate_series(1,20), 'test_data');
   INSERT 0 20
   gaussdb=# INSERT INTO tbl_aes VALUES (generate_series(1,20), 'test_data');
   INSERT 0 20
   gaussdb=# INSERT INTO tbl_sm4 VALUES (generate_series(1,20), 'test_data');
   INSERT 0 20
   ```
   
   
4. 通过pg_relation_filepath函数查询表文件存储相对路径与文件名。
   
   ```
   gaussdb=# SELECT pg_relation_filepath('tbl');
    pg_relation_filepath
   ----------------------
    base/<db_oid>/<tbl_file>
   (1 row)
   gaussdb=# SELECT pg_relation_filepath('tbl_aes');
    pg_relation_filepath
   ----------------------
    base/<db_oid>/<tbl_aes_file>
   (1 row)
   gaussdb=# SELECT pg_relation_filepath('tbl_sm4');
    pg_relation_filepath
   ----------------------
    base/<db_oid>/<tbl_sm4_file>
   (1 row)
   ```
   
   
5. 根据[4]获取到的路径，进入表文件存储目录后，通过操作系统的grep命令对表文件进行文本内容匹配。表tbl文件匹配成功，说明数据已明文存储；表tbl_aes与表tbl_sm4文件则未匹配成功，说明数据已加密存储。
   
   ```
   grep -nir 'test_data' <tbl_file>
   Binary file <tbl_file> matches
   grep -nir 'test_data' <tbl_aes_file>
   grep -nir 'test_data' <tbl_sm4_file>
   ```
   
   
6. 删除表完成清理。 
   ```
   gaussdb=# DROP TABLE tbl;
   DROP TABLE
   gaussdb=# DROP TABLE tbl_aes;
   DROP TABLE
   gaussdb=# DROP TABLE tbl_sm4;
   DROP TABLE
   ```
   
   
 
#### 索引数据加密
1. gsql客户端连接DN主节点，创建加密表tbl_aes；创建明文索引idx1与加密索引idx2。 
   ```
   gaussdb=# CREATE TABLE tbl_aes (c1 INT, c2 TEXT) WITH (enable_tde = on);
   CREATE TABLE
   gaussdb=# CREATE INDEX idx1 ON tbl_aes(c2);
   CREATE INDEX
   gaussdb=# CREATE INDEX idx2 ON tbl_aes(c2) WITH (enable_tde = on);
   CREATE INDEX
   ```
   
   
2. 查询pg_class表。索引idx2存在透明加密表选项，且enable_tde为on。 
   ```
   gaussdb=# SELECT relname,reloptions FROM pg_class WHERE relname LIKE 'idx%';
    relname | reloptions
   ---------+-----------------------------------------------------------------------------------------------------------------------
    idx1    | {storage_type=USTORE}
    idx2    | {enable_tde=on,storage_type=USTORE,encrypt_algo=aes_128_ctr,key_type=...}
   (2 rows)
   ```
   
   
3. 向tbl_aes插入数据。 
   ```
   gaussdb=# INSERT INTO tbl_aes VALUES (generate_series(1,20), 'test_data');
   INSERT 0 20
   ```
   
   
4. 通过pg_relation_filepath函数查询索引文件存储相对路径与文件名。
   
   ```
   gaussdb=# SELECT pg_relation_filepath('idx1');
    pg_relation_filepath
   ----------------------
    base/<db_oid>/<idx1_file>
   (1 row)
   gaussdb=# SELECT pg_relation_filepath('idx2');
    pg_relation_filepath
   ----------------------
    base/<db_oid>/<idx2_file>
   (1 row)
   ```
   
   
5. 根据[4]获取到的路径，进入索引文件存储目录后，通过操作系统的grep命令对索引文件进行文本内容匹配。索引idx1文件匹配成功，说明数据已明文存储；索引idx2文件则未匹配成功，说明数据已加密存储。
   
   ```
   grep -nir 'test_data' <idx1_file>
   Binary file <idx1_file> matches
   grep -nir 'test_data' <idx2_file>
   ```
   
   
6. 删除表完成清理。 
   ```
   gaussdb=# DROP TABLE tbl_aes;
   DROP TABLE
   ```
   
   
 
#### 数据密钥轮转
1. gsql客户端连接主DN节点，创建加密表tbl_aes。 
   ```
   gaussdb=# CREATE TABLE tbl_aes (c1 INT, c2 TEXT) WITH (enable_tde = on);
   CREATE TABLE
   ```
   
   
2. 查询pg_class表。dek_cipher表选项为当前表的数据密钥密文，记录该值。
   
   ```
   gaussdb=# SELECT relname,reloptions FROM pg_class WHERE relname LIKE 'tbl%';
    relname | reloptions
   ---------+-----------------------------------------------------------------------------------------------------------------------
    tbl_aes | {orientation=row,enable_tde=on,compression=no,storage_type=USTORE,segment=off,encrypt_algo=aes_128_ctr,dek_cipher=...}
   (1 row)
   ```
   
   
3. 执行数据密钥轮转命令。 
   ```
   gaussdb=# ALTER TABLE tbl_aes ENCRYPTION KEY ROTATION;
   ALTER TABLE
   ```
   
   
4. 参考[2]，再次查询pg_class表。dek_cipher值发生了改变，说明实际发生了密钥轮转。
5. 删除表完成清理。 
   ```
   gaussdb=# DROP TABLE tbl_aes;
   DROP TABLE
   ```
   
   
 
#### 加密表/非加密表转换
1. gsql客户端连接主DN节点，创建明文表tbl、AES算法加密表tbl_aes。 
   ```
   gaussdb=# CREATE TABLE tbl (c1 INT, c2 TEXT);
   CREATE TABLE
   gaussdb=# CREATE TABLE tbl_aes (c1 INT, c2 TEXT) WITH (enable_tde = on);
   CREATE TABLE
   ```
   
   
2. 向两张表插入数据。 
   ```
   gaussdb=# INSERT INTO tbl VALUES (generate_series(1,20), 'test_data');
   INSERT 0 20
   gaussdb=# INSERT INTO tbl_aes VALUES (generate_series(1,20), 'test_data');
   INSERT 0 20
   ```
   
   
3. 通过pg_relation_filepath函数查询表文件存储相对路径与文件名。
   
   ```
   gaussdb=# SELECT pg_relation_filepath('tbl');
    pg_relation_filepath
   ----------------------
    base/<db_oid>/<tbl_file>
   (1 row)
   gaussdb=# SELECT pg_relation_filepath('tbl_aes');
    pg_relation_filepath
   ----------------------
    base/<db_oid>/<tbl_aes_file>
   (1 row)
   ```
   
   
4. 根据[3]获取到的路径，进入表文件存储目录后，通过操作系统的grep命令对表文件进行文本内容匹配。表tbl文件匹配成功，说明数据已明文存储；表tbl_aes未匹配成功，说明数据已加密存储。
   
   ```
   grep -nir 'test_data' <tbl_file>
   Binary file <tbl_file> matches
   grep -nir 'test_data' <tbl_aes_file>
   ```
   
   
5. 执行表加密转换语句，将表tbl变为加密表，表tbl_aes变为非加密表；然后执行VACUUM FULL语句，保证存量数据的加密状态转换。 
   ```
   gaussdb=# ALTER TABLE tbl SET (enable_tde = on);
   ALTER TABLE
   gaussdb=# ALTER TABLE tbl_aes SET (enable_tde = off);
   ALTER TABLE
   gaussdb=# VACUUM FULL tbl;
   VACUUM
   gaussdb=# VACUUM FULL tbl_aes;
   VACUUM
   ```
   
   
6. 参考[3]，查询表文件存储相对路径与文件名（VACUUM FULL命令会导致表文件名发生变化）。
7. 参考[4]，通过操作系统的grep命令对表文件进行文本内容匹配。表tbl文件匹配失败，说明数据已加密存储；表tbl_aes匹配成功，说明数据已明文存储。
8. 删除表完成清理。 
   ```
   gaussdb=# DROP TABLE tbl;
   DROP TABLE
   gaussdb=# DROP TABLE tbl_aes;
   DROP TABLE
   ```
   
   
 
