DBMS_REDACT

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

(可选参数)指定的脱敏函数类型。取值如下:

  • DBMS_REDACT.NONE

  • DBMS_REDACT.FULL(默认值)

  • DBMS_REDACT.NULLIFY

  • DBMS_REDACT.PARTIAL

  • DBMS_REDACT.RANDOM

  • DBMS_REDACT.REGEXP

  • DBMS_REDACT.REGEXP_WIDTH (兼容性提供类型,与REGEXP行为一致)

function_parameters

(可选参数)指定脱敏函数的函数参数,该参数仅在PARTIAL类型脱敏时,对字符串类型、数字类型以及日期类型生效。

  • 字符串类型:参数格式例如,VVVVFFVVVV, VV-VVVV-VV, X, 1, 4,参数通过逗号进行分隔。

    第一部分为输入参数,其中V代表可能被脱敏的字符,F代表忽略的字符;第二部分为输出参数,其中V按照输入参数的前后顺序,需保证输入参数与输出参数中的V数量相同;第三部分为脱敏字符,即脱敏后显示的字符;第四部分为脱敏的起始位置;第五部分为脱敏的终止位置,起始/终止位置均相对于输入参数中的V而言。

    例如,字符串内容为abcdefg使用参数VVVFFVVV, VV-VV-VV, X, 1, 3, 脱敏结果为XX-Xe-fg

  • 数字类型:参数格式例如,0, 1, 4

    第一部分为脱敏数字,即脱敏后显示的数字,取值范围为0~9;第二部分为脱敏的起始位置;第三部分为脱敏的终止位置,起始/终止位置均相对于表中数字类型的列而言。

    例如,数字类型123456789使用参数5, 2, 5脱敏后的结果为155556789

  • 日期类型:参数格式例如,m12d1y2001h1m1s1

    参数中的字母从左至右的含义依次为Month、Day、Year、Hour、Minute、Second(即月份、日期、年份、小时、分钟、秒钟)。

    任意位置使用大写字符表示对应字段无需脱敏,使用小写字母加数字表示对指定类型进行脱敏后的值。

    例如,D表示日期无需处理,d15则表示日期显示为15号。通过参数m12Dy2001Hm1s12023-01-01 12:00:00脱敏的结果为2001-12-01 12:01:01

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

(可选参数)执行的操作类型。取值如下:

  • DBMS_REDACT.ADD_COLUMN

  • BMS_REDACT.DROP_COLUMN

  • DBMS_REDACT.MODIFY_EXPRESSION

  • DBMS_REDACT.MODIFY_COLUMN

  • DBMS_REDACT.SET_POLICY_DESCRIPTION

  • DBMS_REDACT.SET_COLUMN_DESCRIPTION

column_name

(可选参数)脱敏策略应用到的列的名称。

function_type

(可选参数)指定的脱敏函数类型。取值如下:

  • DBMS_REDACT.NONE

  • DBMS_REDACT.FULL(默认值)

  • DBMS_REDACT.NULLIFY

  • DBMS_REDACT.PARTIAL

  • DBMS_REDACT.RANDOM

  • DBMS_REDACT.REGEXP

  • DBMS_REDACT.REGEXP_WIDTH (兼容性提供类型,与REGEXP行为一致)

function_parameters

(可选参数)指定脱敏函数的函数参数,该参数仅在PARTIAL类型脱敏时,对字符串类型、数字类型以及日期类型生效。

  • 字符串类型:参数格式例如,VVVVFFVVVV, VV-VVVV-VV, X, 1, 4,参数通过逗号进行分隔。

    第一部分为输入参数,其中V代表可能被脱敏的字符,F代表忽略的字符;第二部分为输出参数,其中V按照输入参数的前后顺序,需保证输入参数与输出参数中的V数量相同;第三部分为脱敏字符,即脱敏后显示的字符;第四部分为脱敏的起始位置;第五部分为脱敏的终止位置,起始/终止位置均相对于输入参数中的V而言。

    例如,字符串内容为abcdefg使用参数VVVFFVVV, VV-VV-VV, X, 1, 3, 脱敏结果为XX-Xe-fg

  • 数字类型:参数格式例如,0, 1, 4

    第一部分为脱敏数字,即脱敏后显示的数字,取值范围为0~9;第二部分为脱敏的起始位置;第三部分为脱敏的终止位置,起始/终止位置均相对于表中数字类型的列而言。

    例如,数字类型123456789使用参数5, 2, 5脱敏后的结果为155556789

  • 日期类型:参数格式例如,m12d1y2001h1m1s1

    参数中的字母从左至右的含义依次为Month、Day、Year、Hour、Minute、Second(即月份、日期、年份、小时、分钟、秒钟)。

    任意位置使用大写字符表示对应字段无需脱敏,使用小写字母加数字表示对指定类型进行脱敏后的值。

    例如,D表示日期无需处理,d15则表示日期显示为15号。通过参数m12Dy2001Hm1s12023-01-01 12:00:00脱敏的结果为2001-12-01 12:01:01

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)