
# CREATE REDACTION POLICY
#### 功能描述
在数据库表上创建数据脱敏策略。
DWS提供列级别的数据脱敏策略（REDACTION POLICY）功能。针对某些敏感信息（如身份证号、手机号、银行卡号等），通过应用脱敏函数进行原始数据的变形改写，实现敏感隐私数据的可靠保护，增强产品在数据安全和隐私保护方面的能力。
#### 注意事项
- 数据脱敏特性使用GUC参数feature_support_options进行控制，当出现"REDACTION POLICY is not yet supported, please add enable_data_redaction into feature_support_options."或者"Cannot use the feature of data redaction, please drop existed redaction policy or add enable_data_redaction into feature_support_options."的报错信息时，说明没有开启数据脱敏特性，需联系技术支持人员设置feature_support_options参数，开启数据脱敏特性。
- 只有表对象的属主和被授予gs_role_redaction预置角色的用户具有创建脱敏策略的权限。
- 具有sysadmin权限的用户，可跳过脱敏策略检查，对脱敏列数据一直具有可见性，即脱敏策略不生效。
- 仅支持在普通表和非EXTERNAL SCHEMA的外表（OBS、HDFS、GDS、协调分析外表）创建数据脱敏策略，不支持为系统表、EXTERNAL SCHEMA的外表、临时表、UNLOGGED表以及视图和函数对象创建脱敏策略。
- 表对象与脱敏策略间一一对应。一个脱敏策略是表对象所有脱敏列的集合，可以给脱敏表对象的多个列字段指定脱敏函数，且不同脱敏列对象可以采用不同的脱敏函数。
- 创建脱敏策略时，默认策略生效，即属性enable值为true。
- 支持通过指定角色匹配脱敏策略。
- 不支持通过同义词向普通表对象创建脱敏策略。
 
#### 语法格式
```
CREATE REDACTION POLICY [IF NOT EXISTS] policy_name ON table_name [ { BEFORE | AFTER } old_policy_name ]
    [ WHEN (when_expression) ]
    [ ADD COLUMN column_name WITH redaction_function_name ( [ argument [, ...] ] )] [, ... ];
```
#### 参数说明
表1CREATE REDACTION POLICY参数说明 
| 参数                       | 描述                                                                                                                                                                                                                      | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|
| policy_name              | 脱敏策略名称。                                                                                                                                                                                                                 | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| table_name               | 应用脱敏策略的表名。                                                                                                                                                                                                              | 有效的表名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| BEFORE \| AFTER          | 指定当前策略创建的相对位置，通常一张表使用一个脱敏策略即可。 缺省时，默认当前策略创建在当前系统表中记录的目标表的候选策略的最后一个之后。                                                                                                      | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| WHEN ( when_expression ) | WHEN子句指定一个生效表达式。仅当此表达式为真时，脱敏策略才可能生效。                                                                                                                                                                                    | 查询语句涉及脱敏表对象时，仅当脱敏策略的WHEN子句表达式为真时，查询对脱敏列数据才可能不可见，即脱敏策略生效。通常，采用WHEN子句来限定脱敏策略的生效用户范围，具有较严格的约束规格。 WHEN子句的规格约束如下： 1. 表达式可以是AND、OR连接的多个子表达式。  2. 每个子表达式仅支持=、\<\>、!=、\>=、\>、\<=、\<这7种运算符，左右值只能取常量值或者下列系统常量值之一：SESSION_USER、CURRENT_USER、USER、CURRENT_ROLE、CURRENT_SCHEMA系统常量或者SYS_CONTEXT系统函数。  3. 每个子表达式可以是IN、NOT IN表达式，左值可以是上述2中所列系统常量值，右值数组的每个元素必须是常量值。  4. 每个子表达式可以是[pg_has_role(user, role, privilege)](https://support.huaweicloud.com/sqlreference-dws/dws_06_0339.html#ZH-CN_TOPIC_0000001811515573__section13942057572)系统函数。  5. 当脱敏策略永远成立时，即对所有用户（含表对象属主）均生效，建议使用表达式（1=1）创建脱敏策略。  6. WHEN子句缺省时，脱敏策略默认不生效，需用户手动指定WHEN子句表达式。   |
| column_name              | 应用脱敏策略的表的列名。                                                                                                                                                                                                            | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| redaction_function_name  | 脱敏函数名。                                                                                                                                                                                                                  | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| arguments                | 脱敏函数的参数列表。 DWS支持MASK_NONE、MASK_FULL、MASK_PARTIAL三种内置脱敏函数。同时支持使用C语言、PL/pgSQL语言创建的用户自定义脱敏函数，具体可参考[数据脱敏函数](https://support.huaweicloud.com/sqlreference-dws/dws_06_0064.html)。 | - MASK_NONE，表示不进行任何脱敏处理。  - MASK_FULL，表示全脱敏成固定值（如数字转为0）。  - MASK_PARTIAL，表示按指定的字符类型，数值类型或时间类型进行部分脱敏处理（如手机号部分数字遮盖为\*）。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   
#### 示例1：对指定用户创建脱敏策略
1. 打开数据脱敏功能。 联系技术支持人员设置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
   ```
   
2. 创建用户alice和matu。
   ```
   CREATE ROLE alice PASSWORD '{password}';
   CREATE ROLE matu PASSWORD '{password}';
   ```
   
3. 用户alice创建表对象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);
   ```
   
4. 查看表数据。
   ```
   SELECT * FROM emp;
   ```
   ![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002583981178.png)
   
5. 用户alice为表对象emp创建脱敏策略mask_emp，字段salary对用户matu不可见。
   ```
   CREATE REDACTION POLICY mask_emp ON emp WHEN(current_user = 'matu') ADD COLUMN salary WITH mask_full(salary);
   ```
   
6. 用户alice授予用户matu表emp的SELECT权限。
   ```
   GRANT SELECT ON emp TO matu;
   ```
   
7. 切至用户matu。
   ```
   SET ROLE matu PASSWORD '{password}';
   ```
   
8. matu查询表emp，字段salary数据已脱敏。
   ```
   SELECT * FROM emp;
   ```
   ![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002583986126.png)
   
 
#### 示例2：对指定角色创建脱敏策略
1. 创建角色redact_role。
   ```
   CREATE ROLE redact_role PASSWORD '{password}';
   ```
   
2. 将用户matu，alice加入角色redact_role。
   ```
   GRANT redact_role to matu,alice;
   ```
   
3. 管理员用户创建表对象emp1并插入数据。
   ```
   CREATE TABLE emp1(id int, name varchar(20), salary NUMERIC(10,2)); 
   INSERT INTO emp1 VALUES(3, 'Rose', 2230.20), (4, 'Jack', 899.88);
   ```
   
4. 查看表emp1数据。
   ```
   SELECT * FROM emp1;
   ```
   ![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002583833820.png)
   
5. 管理员用户为表对象emp1创建脱敏策略mask_emp1，使字段salary对角色redact_role不可见。
   ```
   CREATE REDACTION POLICY mask_emp1 ON emp1 WHEN(pg_has_role(current_user, 'redact_role', 'member')) ADD COLUMN salary WITH mask_full(salary);
   ```
   若不指定用户，默认为当前用户current_user。
   ```
   CREATE REDACTION POLICY mask_emp1 ON emp1 WHEN (pg_has_role('redact_role', 'member')) ADD COLUMN salary WITH mask_full(salary);
   ```
   
6. 管理员用户授予用户matu表emp1的SELECT权限。
   ```
   GRANT SELECT ON emp1 TO matu;
   ```
   
7. 切换至用户matu。
   ```
   SET ROLE matu PASSWORD '{password}';
   ```
   
8. matu查询表emp，字段salary数据已脱敏。
   ```
   SELECT * FROM emp1;
   ```
   ![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002583834358.png)
   
 
#### 相关链接
[ALTER REDACTION POLICY](https://support.huaweicloud.com/sqlreference-dws/dws_06_0132.html)，[DROP REDACTION POLICY](https://support.huaweicloud.com/sqlreference-dws/dws_06_0199.html)
#### 使用实践
[DWS数据脱敏](https://support.huaweicloud.com/devg-dws/dws_04_0062.html)
