DBMS_REDACT内置包用于对低权限用户或应用查询的数据进行脱敏处理,保护数据库数据安全。
DBMS_REDACT子程序总览
子程序 | 说明 |
ADD_POLICY Procedure | 添加数据脱敏策略。 |
ALTER_POLICY Procedure | 修改数据脱敏策略。 |
DISABLE_POLICY Procedure | 禁用数据脱敏策略。 |
ENABLE_POLICY Procedure | 启用数据脱敏策略。 |
DROP_POLICY Procedure | 删除数据脱敏策略。 |
UPDATE_FULL_REDACTION_VALUES Procedure | 更新全脱敏的不同类型的默认值。 |
DBMS_REDACT内置包包含以下两个GUC参数:
polar_enable_masking_policy:是否启用DBMS_REDACT数据脱敏功能。
polar_enable_subquery_masking:是否在启用数据脱敏功能的条件下,对子查询进行脱敏。
PolarDB使用DBMS_REDACT内置包对数据进行脱敏时,如果存在上层SQL引用子查询中的脱敏列,会使用脱敏后的值。 例如,存在一张表mask_tbl(a int, b int);
,表上包含对a
列的脱敏策略时,考虑以下SQL:
SELECT t1.a, t2.a FROM (SELECT a FROM mask_tbl) t1 LEFT JOIN (SELECT a FROM mask_tbl) t2 ON t1.a=t2.a;
在上述SQL中,JOIN
语句的ON
条件将使用脱敏后的值进行判断。如果希望使用脱敏前的值进行判断,可以使用以下SQL关闭子查询脱敏功能。
SET polar_enable_subquery_masking = off;
此时再次执行上述SELECT
语句即可在JOIN
子句中使用未脱敏的值进行LEFT JOIN
,同样返回的值也是未脱敏的。
ADD_POLICY
该存储过程用于在表上添加数据脱敏策略。
语法
DBMS_REDACT.ADD_POLICY(
object_schema VARCHAR2 DEFAULT NULL,
object_name VARCHAR2,
policy_name VARCHAR2,
policy_description VARCHAR2 DEFAULT NULL,
column_name VARCHAR2 DEFAULT NULL,
column_description VARCHAR2 DEFAULT NULL,
function_type INTEGER DEFAULT 1,
function_parameters VARCHAR2 DEFAULT NULL,
expression VARCHAR2,
enable BOOLEAN DEFAULT TRUE,
regexp_pattern VARCHAR2 DEFAULT NULL,
regexp_replace_string VARCHAR2 DEFAULT NULL,
regexp_position INTEGER DEFAULT 1,
regexp_occurrence INTEGER DEFAULT 0,
regexp_match_parameter VARCHAR2 DEFAULT NULL);
参数说明
参数 | 说明 |
object_schema | (可选参数)目标表所在的schema。如果不指定,则为当前用户的默认schema。 |
object_name | 数据脱敏策略所在的表的名称。 |
policy_name | 数据脱敏策略名称。 |
column_name | (可选参数)脱敏策略应用到的列的名称。 |
function_type | (可选参数)指定的脱敏函数类型。取值如下:
|
function_parameters | (可选参数)指定脱敏函数的函数参数,该参数仅在PARTIAL类型脱敏时,对字符串类型、数字类型以及日期类型生效。
|
expression | 策略对应的BOOLEAN类型表达式。仅当该表达式的结果为TRUE时,脱敏策略才会执行。 |
enable | 用于确定创建时是否启用数据脱敏策略的BOOLEAN值。 |
regexp_pattern | (可选参数)正则表达式匹配模式。 |
regexp_replace_string | (可选参数)正则表达式替换字符串。 |
regexp_position | (可选参数)正则搜索开始的字符位置。默认值为1。 |
regexp_occurrence | (可选参数)正则表达式匹配到的模式的替换次数。0表示替换所有匹配到的位置;正整数n表示替换前n次匹配到的位置。 |
regexp_match_parameter | (可选参数)更改默认匹配行为,取值包括,'i','c','n','m','x'。 |
policy_description | (可选参数)脱敏策略的描述。 |
column_description | (可选参数)脱敏列的描述。 |
示例
该示例展示了如何给一张表添加数据脱敏策略。
CREATE TABLE masktbl(name varchar2(40), num integer);
INSERT INTO masktbl VALUES('Alice', 123456789);
INSERT INTO masktbl VALUES('Bob', 234567890);
-- 1. 创建脱敏策略
BEGIN
DBMS_REDACT.ADD_POLICY(object_name => 'masktbl',
policy_name => 'p1',
expression => '1=1',
column_name => 'num',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => '5,1,4');
END;
-- 2. SELECT查询结果中num列为脱敏处理后的结果
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 555556789
Bob | 555567890
(2 rows)
ALTER_POLICY
该存储过程用于修改数据脱敏策略。
语法
DBMS_REDACT.ALTER_POLICY (
object_schema VARCHAR2 DEFAULT NULL,
object_name VARCHAR2,
policy_name VARCHAR2,
action INTEGER DEFAULT 1,
column_name VARCHAR2 DEFAULT NULL,
function_type INTEGER DEFAULT 1,
function_parameters VARCHAR2 DEFAULT NULL,
expression VARCHAR2 DEFAULT NULL,
regexp_pattern VARCHAR2 DEFAULT NULL,
regexp_replace_string VARCHAR2 DEFAULT NULL,
regexp_position INTEGER DEFAULT 1,
regexp_occurrence INTEGER DEFAULT 0,
regexp_match_parameter VARCHAR2 DEFAULT NULL,
policy_description VARCHAR2 DEFAULT NULL,
column_description VARCHAR2 DEFAULT NULL);
参数说明
参数 | 说明 |
object_schema | 目标表所在的schema。如果不指定,则为当前用户的默认schema。 |
object_name | 数据脱敏策略所在的表的名称。 |
policy_name | 策略名称。 |
action | (可选参数)执行的操作类型。取值如下:
|
column_name | (可选参数)脱敏策略应用到的列的名称。 |
function_type | (可选参数)指定的脱敏函数类型。取值如下:
|
function_parameters | (可选参数)指定脱敏函数的函数参数,该参数仅在PARTIAL类型脱敏时,对字符串类型、数字类型以及日期类型生效。
|
expression | 策略对应的BOOLEAN类型表达式。仅当该表达式的结果为TRUE时,脱敏策略才会执行。 |
expression | (可选参数)策略对应的BOOLEAN类型表达式。仅当该表达式的结果为TRUE时,脱敏策略才会执行。 |
regexp_pattern | (可选参数)正则表达式匹配模式。 |
regexp_replace_string | (可选参数)正则表达式替换字符串。 |
regexp_position | (可选参数)正则搜索开始的字符位置。默认值为1。 |
regexp_occurrence | (可选参数)正则表达式匹配到的模式的替换次数。0表示替换所有匹配到的位置; 正整数n表示替换前n次匹配到的位置。 |
regexp_match_parameter | (可选参数)更改默认匹配行为。取值包括,'i','c','n','m','x'。 |
policy_description | (可选参数)脱敏策略的描述。 |
column_description | (可选参数)脱敏列的描述。 |
示例
该示例展示了如何对策略进行修改,添加多个脱敏列。
CREATE TABLE masktbl(name varchar2(40), num integer);
INSERT INTO masktbl VALUES('Alice', 123456789);
INSERT INTO masktbl VALUES('Bob', 234567890);
-- 1. 创建脱敏策略
BEGIN
DBMS_REDACT.ADD_POLICY(object_name => 'masktbl',
policy_name => 'p1',
expression => '1=1');
END;
-- 2. SELECT 查询结果,数据未脱敏
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 123456789
Bob | 234567890
(2 rows)
BEGIN
DBMS_REDACT.ALTER_POLICY(object_name => 'masktbl',
policy_name => 'p1',
action => dbms_redact.ADD_COLUMN,
column_name => 'num',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => '9, 1, 4');
END;
-- 3. SELECT查询结果,数据脱敏
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 999956789
Bob | 999967890
(2 rows)
BEGIN
DBMS_REDACT.ALTER_POLICY(object_name => 'masktbl',
policy_name => 'p1',
action => DBMS_REDACT.MODIFY_COLUMN,
column_name => 'num',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => '5, 1, 4');
END;
-- 4. 修改数据脱敏定义后,SELECT查询结果
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 555556789
Bob | 555567890
(2 rows)
DISABLE_POLICY
该存储过程用于禁用数据脱敏策略。
语法
DBMS_REDACT.DISABLE_POLICY (
object_schema VARCHAR2 DEFAULT NULL,
object_name VARCHAR2,
policy_name VARCHAR2);
参数说明
参数 | 说明 |
object_schema | 目标表所在的schema。如果不指定,则为当前用户的默认schema。 |
object_name | 需要禁用数据脱敏策略的表的名称。 |
policy_name | 需要禁用的策略名称。 |
示例
该示例首先创建一个默认启用的数据脱敏策略,然后通过DISABLE_POLICY禁用该脱敏策略。
CREATE TABLE masktbl(name varchar2(40), num integer);
INSERT INTO masktbl VALUES('Alice', 123456789);
INSERT INTO masktbl VALUES('Bob', 234567890);
-- 1. 创建脱敏策略
BEGIN
DBMS_REDACT.ADD_POLICY(object_name => 'masktbl',
policy_name => 'p1',
expression => '1=1',
column_name => 'num',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => '5,1,4');
END;
-- 2. SELECT 查询结果中num列为脱敏处理后的结果
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 555556789
Bob | 555567890
(2 rows)
-- 3. 禁用数据脱敏策略
CALL DBMS_REDACT.DISABLE_POLICY(object_name => 'masktbl', policy_name => 'p1');
-- 4. SELECT 查询结果中num列为未脱敏数据
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 123456789
Bob | 234567890
(2 rows)
ENABLE_POLICY
该存储过程用于启用数据脱敏策略。
语法
DBMS_REDACT.ENABLE_POLICY (
object_schema VARCHAR2 DEFAULT NULL,
object_name VARCHAR2,
policy_name VARCHAR2);
参数说明
参数 | 说明 |
object_schema | (可选参数)目标表所在的schema。如果不指定,则为当前用户的默认schema。 |
object_name | 需要启用数据脱敏策略的表的名称。 |
policy_name | 需要启用的策略名称 |
示例
该示例首先创建一个禁用的脱敏策略,然后通过ENABLE_POLICY存储过程启用该策略。
CREATE TABLE masktbl(name varchar2(40), num integer);
INSERT INTO masktbl VALUES('Alice', 123456789);
INSERT INTO masktbl VALUES('Bob', 234567890);
-- 1. 创建脱敏策略
BEGIN
DBMS_REDACT.ADD_POLICY(object_name => 'masktbl',
policy_name => 'p1',
expression => '1=1',
column_name => 'num',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => '5,1,4',
enable => false);
END;
-- 2. SELECT 查询结果中num列为未脱敏数据
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 123456789
Bob | 234567890
(2 rows)
-- 3. 启用数据脱敏策略
CALL DBMS_REDACT.ENABLE_POLICY(object_name => 'masktbl', policy_name => 'p1');
-- 4. SELECT 查询结果中num列为脱敏后的结果
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 555556789
Bob | 555567890
(2 rows)
DROP_POLICY
该存储过程用于删除指定表上的数据脱敏策略。
语法
DBMS_REDACT.DROP_POLICY (
object_schema VARCHAR2 DEFAULT NULL,
object_name VARCHAR2,
policy_name VARCHAR2);
参数说明
参数 | 说明 |
object_schema | (可选参数)目标表所在的schema。如果不指定,则为当前用户的默认schema。 |
object_name | 需要删除数据脱敏策略的表的名称。 |
policy_name | 需要删除的策略名称。 |
示例
该示例首先创建一个默认启用的数据脱敏策略,然后通过DROP_POLICY删除该策略。
CREATE TABLE masktbl(name varchar2(40), num integer);
INSERT INTO masktbl VALUES('Alice', 123456789);
INSERT INTO masktbl VALUES('Bob', 234567890);
-- 1. 创建脱敏策略
BEGIN
DBMS_REDACT.ADD_POLICY(object_name => 'masktbl',
policy_name => 'p1',
expression => '1=1',
column_name => 'num',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => '5,1,4');
END;
-- 2. SELECT 查询结果中num列为脱敏处理后的结果
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 555556789
Bob | 555567890
(2 rows)
-- 3. 删除数据脱敏策略
CALL DBMS_REDACT.DROP_POLICY(object_name => 'masktbl', policy_name => 'p1');
-- 4. SELECT 查询结果中num列为未脱敏数据
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----------
Alice | 123456789
Bob | 234567890
(2 rows)
UPDATE_FULL_REDACT_VALUES
该存储过程用于更新全脱敏下的不同类型的默认值。
语法
DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES (
number_val NUMBER DEFAULT NULL,
binfloat_val FLOAT4 DEFAULT NULL,
bindouble_val FLOAT8 DEFAULT NULL,
char_val CHAR DEFAULT NULL,
varchar_val VARCHAR2 DEFAULT NULL,
nchar_val NCHAR DEFAULT NULL,
nvarchar_val NVARCHAR2 DEFAULT NULL,
date_val DATE DEFAULT NULL,
ts_val TIMESTAMP DEFAULT NULL,
tswtz_val TIMESTAMPTZ DEFAULT NULL,
blob_val BLOB DEFAULT NULL,
clob_val CLOB DEFAULT NULL,
nclob_val NCLOB DEFAULT NULL);
参数说明
参数 | 说明 |
number_val | 更新NUMBER类型列在全脱敏下的默认值。 |
binfloat_val | 更新FLOAT类型列在全脱敏下的默认值。 |
bindouble_val | 更新DOUBLE类型列在全脱敏下的默认值。 |
char_val | 更新CHAR/NCHAR类型列在全脱敏下的默认值。 |
varchar_val | 更新VARCHAR2/NVARCHAR2/CLOB/NCLOB类型列在全脱敏下的默认值。 |
nchar_val | 仅做兼容性处理,无需关注。 |
nvarchar_val | 仅做兼容性处理,无需关注。 |
date_val | 更新DATE类型列在全脱敏下的默认值。 |
ts_val | 更新TIMESTAMP类型列在全脱敏下的默认值。 |
tswtz_val | 更新TIMESTAMPTZ类型列在全脱敏下的默认值。 |
blob_val | 更新BLOB类型列在全脱敏下的默认值。 |
clob_val | 仅做兼容性处理,无需关注。 |
nclob_val | 仅做兼容性处理,无需关注。 |
示例
该示例更新了部分数据类型列在全脱敏下的默认值,并进行查询。
CREATE TABLE masktbl(name varchar2(40), num integer);
INSERT INTO masktbl VALUES('Alice', 123456789);
INSERT INTO masktbl VALUES('Bob', 234567890);
-- 1. 创建脱敏策略
BEGIN
DBMS_REDACT.ADD_POLICY(object_name => 'masktbl',
policy_name => 'p1',
expression => '1=1',
column_name => 'num',
function_type => DBMS_REDACT.FULL);
END;
-- 2. SELECT 查询结果中num列为脱敏处理后的结果
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-----
Alice | 0
Bob | 0
(2 rows)
-- 3. 更新全脱敏默认值
CALL DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES(number_val => 12345);
-- 4. 再次执行查询,结果中num列显示为修改后的脱敏值
SELECT name, num FROM masktbl ORDER BY 1, 2;
name | num
-------+-------
Alice | 12345
Bob | 12345
(2 rows)