CREATE REDACTION POLICY
功能描述
对表创建数据脱敏策略。
注意事项
- 数据脱敏特性使用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_redaction_policy预置角色的用户具有创建脱敏策略的权限。
- 仅支持在普通表和非EXTERNAL SCHEMA的外表(OBS、HDFS、GDS、协调分析外表)创建数据脱敏策略,不支持为系统表、EXTERNAL SCHEMA的外表、临时表、UNLOGGED表以及视图和函数对象创建脱敏策略。
- 不支持通过同义词向普通表对象创建脱敏策略。
- 表对象与脱敏策略间一一对应。一个脱敏策略是表对象所有脱敏列的集合,可以给脱敏表对象的多个列字段指定脱敏函数,且不同脱敏列对象可以采用不同的脱敏函数。
- 创建脱敏策略时,默认策略生效,即属性enable值为true。
- 具有sysadmin权限的用户,可跳过脱敏策略检查,对脱敏列数据一直具有可见性,即脱敏策略不生效。
- 支持通过指定角色匹配脱敏策略。
语法格式
1 2 3 |
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 [, ...] ] )] [, ... ]; |
参数说明
参数 |
描述 |
取值范围 |
---|---|---|
policy_name |
脱敏策略名称。 |
- |
table_name |
应用脱敏策略的表名。 |
- |
BEFORE | AFTER |
指定当前策略创建的相对位置,通常一张表使用一个脱敏策略即可。缺省时表示:默认当前策略创建在当前系统表中记录的目标表的候选策略的最后一个之后。 |
- |
WHEN ( when_expression ) |
WHEN子句指定一个生效表达式。仅当此表达式为真时,脱敏策略才可能生效。 |
查询语句涉及脱敏表对象时,仅当脱敏策略的WHEN子句表达式为真时,查询对脱敏列数据才可能不可见,即脱敏策略生效。通常,采用WHEN子句来限定脱敏策略的生效用户范围,具有较严格的约束规格。 WHEN子句的规格约束如下:
|
column_name |
脱敏策略应用的表对象的列名。 |
- |
redaction_function_name |
对脱敏列应用的脱敏函数。 |
- |
arguments |
脱敏函数的参数列表。 |
|
示例
对指定用户创建脱敏策略。
- 创建用户alice和matu:
1 2
CREATE ROLE alice PASSWORD '{password}'; CREATE ROLE matu PASSWORD '{password}';
- 用户alice创建表对象emp并插入数据:
1 2
CREATE TABLE emp(id int, name varchar(20), salary NUMERIC(10,2)); INSERT INTO emp VALUES(1, 'July', 1230.10), (2, 'David', 999.99);
- 用户alice为表对象emp创建脱敏策略mask_emp,字段salary对用户matu不可见:
1
CREATE REDACTION POLICY mask_emp ON emp WHEN(current_user = 'matu') ADD COLUMN salary WITH mask_full(salary);
- 用户alice授予用户matu表emp的SELECT权限:
1
GRANT SELECT ON emp TO matu;
- 切至用户matu:
1
SET ROLE matu PASSWORD '{password}';
- 查询表emp,字段salary数据已脱敏:
1
SELECT * FROM emp;
对角色创建脱敏策略。
- 创建角色redact_role:
1
CREATE ROLE redact_role PASSWORD '{password}';
- 将用户matu,alice加入角色redact_role:
1
GRANT redact_role to matu,alice;
- 管理员用户创建表对象emp1并插入数据:
1 2
CREATE TABLE emp1(id int, name varchar(20), salary NUMERIC(10,2)); INSERT INTO emp1 VALUES(3, 'Rose', 2230.20), (4, 'Jack', 899.88);
- 管理员用户为表对象emp1创建脱敏策略mask_emp1,使字段salary对角色redact_role不可见。
1
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:
1
CREATE REDACTION POLICY mask_emp1 ON emp1 WHEN (pg_has_role('redact_role', 'member')) ADD COLUMN salary WITH mask_full(salary);
- 管理员用户授予用户matu表emp1的SELECT权限:
1
GRANT SELECT ON emp1 TO matu;
- 切换至用户matu:
1
SET ROLE matu PASSWORD '{password}';
- 查询表emp,字段salary数据已脱敏。
1
SELECT * FROM emp1;