更新时间:2022-08-16 GMT+08:00
CREATE REDACTION POLICY
功能描述
对表创建数据脱敏策略。
注意事项
- 只有表对象的属主具有创建脱敏策略的权限。
- 仅支持在普通表创建数据脱敏策略,不支持为系统表、HDFS表、外表、临时表、UNLOGGED表以及视图和函数对象创建脱敏策略。
- 不支持通过同义词向普通表对象创建脱敏策略。
- 表对象与脱敏策略间一一对应。一个脱敏策略是表对象所有脱敏列的集合,可以给脱敏表对象的多个列字段指定脱敏函数,且不同脱敏列对象可以采用不同的脱敏函数。
- 创建脱敏策略时,默认策略生效,即属性enable值为true。
- 具有sysadmin权限的用户,会绕过脱敏策略检查,对脱敏列数据一直具有可见性,即脱敏策略不生效。
语法格式
1 2 3 |
CREATE REDACTION POLICY policy_name ON table_name
[ WHEN (when_expression) ]
[ ADD COLUMN column_name WITH redaction_function_name ( [ argument [, ...] ] )] [, ... ];
|
参数说明
- policy_name
脱敏策略名称。
- table_name
应用脱敏策略的表名。
- WHEN ( when_expression )
WHEN子句指定一个生效表达式。仅当此表达式为真时,脱敏策略才可能生效。
查询语句涉及脱敏表对象时,仅当脱敏策略的WHEN子句表达式为真时,查询对脱敏列数据才可能不可见,即脱敏策略生效。通常,采用WHEN子句来限定脱敏策略的生效用户范围,具有较严格的约束规格。
WHEN子句的规格约束如下:
- 表达式可以是AND、OR连接的多个子表达式。
- 每个子表达式仅支持=、<>、!=、>=、>、<=、<七种运算符,左右值只能取常量值或者下列系统常量值之一:SESSION_USER、CURRENT_USER、USER、CURRENT_ROLE、CURRENT_SCHEMA系统常量或者SYS_CONTEXT系统函数。
- 每个子表达式可以是IN、NOT IN表达式,左值可以是上述2中所列系统常量值,右值数组的每个元素必须是常量值。
- 当脱敏策略永远成立时,即对所有用户(含表对象属主)均生效,建议使用表达式(1=1)创建脱敏策略。
- WHEN子句缺省时,脱敏策略默认不生效,需用户手动指定WHEN子句表达式。
- column_name
脱敏策略应用的表对象的列名。
- function_name
对脱敏列应用的脱敏函数。
- arguments
脱敏函数的参数列表。
系统提供MASK_NONE、MASK_FULL、MASK_PARTIAL三种内置脱敏函数,函数规格,请参考数据脱敏函数。同时,支持用户自定义脱敏函数,自定义脱敏函数的规格要求:
- 参数列表除过脱敏格式外,只能包含一个脱敏列。
- 返回值与脱敏列类型一致。
- 函数必须可下推。
- 函数仅实现针对特定数据类型的格式化改写功能,不能涉及与其他表对象的复杂关联操作。
内置脱敏函数已经能够覆盖常见敏感信息的脱敏场景,所以推荐用户优先使用内置脱敏函数创建脱敏策略。
示例
用户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;
|
父主题: DDL语法