
# ALTER REDACTION POLICY
#### 功能描述
修改数据库表上已有的数据脱敏策略，包括脱敏策略生效/失效、策略名称及脱敏列的增删改等内容。
#### 注意事项
只有待修改脱敏策略所应用表对象的属主和被授予gs_role_redaction预置角色的用户才有修改脱敏策略的权限。
#### 语法格式
- 修改脱敏策略的生效表达式。
  ```
  ALTER REDACTION POLICY policy_name ON table_name WHEN (when_expression);
  ```
  
 
- 使脱敏策略生效或失效。
  ```
  ALTER REDACTION POLICY policy_name ON table_name ENABLE | DISABLE;
  ```
  
- 重命名脱敏策略。
  ```
  ALTER REDACTION POLICY policy_name ON table_name RENAME TO new_policy_name;
  ```
  
- 修改脱敏列，包括新增、修改、删除脱敏列。
  ```
  ALTER REDACTION POLICY policy_name ON table_name 
      action;
  ```
  其中，脱敏列操作action可以是以下子句之一：
  ```
  [INHERIT] ADD COLUMN column_name WITH redaction_function_name ( [ argument [, ...] ] )
    | [INHERIT] MODIFY COLUMN column_name WITH redaction_function_name ( [ argument [, ...] ] )
    | DROP COLUMN column_name
  ```
  
#### 参数说明
表1ALTER REDACTION POLICY参数说明 
| 参数                      | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 取值范围                                                                                                                                    |
|:---|:---|:---|
| policy_name             | 要修改的脱敏策略名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 已存在的脱敏策略名。                                                                                                                              |
| table_name              | 要修改的脱敏策略应用的表名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 已存在的表名。                                                                                                                                 |
| when_expression         | 脱敏策略新的生效表达式。                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | -                                                                                                                                       |
| ENABLE \| DISABLE       | 当前脱敏策略是否生效。 - ENABLE，使之前失效的表对象的脱敏策略重新生效。  - DISABLE，使当前应用在表上的脱敏策略失效。                                                                                                                                     | -                                                                                                                                       |
| new_policy_name         | 新的脱敏策略名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。 |
| column_name             | 脱敏表的列字段名。 - 如果新增脱敏列，则指定列字段尚未绑定任何脱敏函数。  - 如果修改脱敏列，则指定列字段为已存在的脱敏列。  - 如果删除脱敏列，则指定列字段为已存在的脱敏列。   | -                                                                                                                                       |
| redaction_function_name | 脱敏函数名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 支持的函数请参考[数据脱敏函数](https://support.huaweicloud.com/sqlreference-dws/dws_06_0064.html)。                                                    |
| arguments               | 脱敏函数的参数列表。 - MASK_NONE，表示不进行任何脱敏处理。  - MASK_FULL，表示全脱敏成固定值。  - MASK_PARTIAL，表示按指定的字符类型，数值类型或时间类型进行部分脱敏处理。      |  支持的函数请参考[数据脱敏函数](https://support.huaweicloud.com/sqlreference-dws/dws_06_0064.html)。                                             |
   
#### 示例
打开数据脱敏功能。
联系技术支持人员设置feature_support_options参数，开启数据脱敏特性。
```
gs_guc set -Z coordinator -Z datanode -N all -I all -c "feature_support_options=enable_data_redaction"
gs_om -t stop && gs_om -t start
```
创建用户test_role和示例表emp并插入数据。
```
CREATE ROLE test_role PASSWORD '{Password}';
```
```
DROP TABLE IF EXISTS emp;
CREATE TABLE emp(id int, name varchar(20), salary NUMERIC(10,2));
INSERT INTO emp VALUES(1, 'July', 1230.10), (2, 'David', 999.99);
```
为表对象emp创建脱敏策略mask_emp，字段salary对用户test_role不可见。
```
CREATE REDACTION POLICY mask_emp ON emp WHEN(current_user = 'test_role') ADD COLUMN salary WITH mask_full(salary);
```
修改脱敏策略生效表达式，使其对指定角色生效（若不指定用户，默认对当前用户生效）。
```
ALTER REDACTION POLICY mask_emp ON emp WHEN (pg_has_role(current_user, 'redact_role', 'member'));
ALTER REDACTION POLICY mask_emp ON emp WHEN (pg_has_role('redact_role', 'member'));
```
修改脱敏策略生效表达式，使其对所有用户均生效。
```
ALTER REDACTION POLICY mask_emp ON emp WHEN (1=1);
```
修改脱敏策略，使其失效。
```
ALTER REDACTION POLICY mask_emp ON emp DISABLE;
```
重新使脱敏策略生效。
```
ALTER REDACTION POLICY mask_emp ON emp ENABLE;
```
重命名脱敏策略为mask_emp_new。
```
ALTER REDACTION POLICY mask_emp ON emp RENAME TO mask_emp_new;
```
新增脱敏列。
```
ALTER REDACTION POLICY mask_emp_new ON emp ADD COLUMN name WITH mask_partial(name, '*', 1, length(name));
```
使用脱敏函数MASK_FULL对name字段数据全脱敏。
```
ALTER REDACTION POLICY mask_emp_new ON emp MODIFY COLUMN name WITH mask_full(name);
```
删除已存在的脱敏列。
```
ALTER REDACTION POLICY mask_emp_new ON emp DROP COLUMN name;
```
#### 相关链接
[CREATE REDACTION POLICY](https://support.huaweicloud.com/sqlreference-dws/dws_06_0168.html)，[DROP REDACTION POLICY](https://support.huaweicloud.com/sqlreference-dws/dws_06_0199.html)
#### 查看脱敏策略和脱敏列信息
DWS提供以下系统表和视图用于查看脱敏策略和脱敏列信息。
- [PG_REDACTION_POLICY](https://support.huaweicloud.com/devg-dws/dws_04_0611.html)系统表，用于查看脱敏策略信息。
- [PG_REDACTION_COLUMN](https://support.huaweicloud.com/devg-dws/dws_04_0610.html)系统表，用于查看脱敏列信息。
- [REDACTION_POLICIES](https://support.huaweicloud.com/devg-dws/dws_04_0858.html)系统视图，用于查看当前数据库内所有脱敏对象信息
- [REDACTION_COLUMNS](https://support.huaweicloud.com/devg-dws/dws_04_0857.html)系统视图，用于查看当前数据库内所有脱敏列信息。
 
