DBMS_REDACT

DBMS_REDACT包支持对查询返回的数据进行脱敏或屏蔽,DBMS_REDACT包提供了创建策略、更改策略、启用策略、禁用策略和删除策略的存储过程,您可以使用这些存储过程实现自定义的数据混淆。

下表列出了DBMS_REDACT包中可以使用的存储过程。

存储过程

返回类型

描述

ADD_POLICY(object_schema, object_name, policy_name, policy_description, column_name, column_description, function_type, function_parameters, expression, enable, regexp_pattern, regexp_replace_string, regexp_position, regexp_occurence, regexp_match_parameter, custom_function_expression)

N/A

在表或视图上增加数据脱敏策略。

ALTER_POLICY(object_schema, object_name, policy_name, action, column_name, function_type, function_parameters, expression, regexp_pattern, regexp_replace_string, regexp_position, regexp_occurence, regexp_match_parameter, policy_description, column_description, custom_function_expression)

N/A

修改数据脱敏策略。

DISABLE_POLICY(object_schema, object_name, policy_name)

N/A

禁用现有的数据脱敏策略。

ENABLE_POLICY(object_schema, object_name, policy_name)

N/A

启用数据脱敏策略。

DROP_POLICY(object_schema, object_name, policy_name)

N/A

删除数据脱敏策略。

UPDATE_FULL_REDACTION_VALUES(number_val, binfloat_val, bindouble_val, char_val, varchar_val, nchar_val, nvarchar_val, datecol_val, ts_val, tswtz_val, blob_val, clob_val, nclob_val)

N/A

变更完全脱敏下不同类型的默认显示值。

存储过程

ADD_POLICY

ADD_POLICY为表创建新的数据脱敏策略。

ADD_POLICY (
<object_schema> IN VARCHAR2 DEFAULT NULL,
<object_name> IN VARCHAR2,
<policy_name> IN VARCHAR2,
<policy_description> IN VARCHAR2 DEFAULT NULL,
<column_name> IN VARCHAR2 DEFAULT NULL,
<column_description> IN VARCHAR2 DEFAULT NULL,
<function_type> IN INTEGER DEFAULT DBMS_REDACT.FULL,
<function_parameters> IN VARCHAR2 DEFAULT NULL,
<expression> IN VARCHAR2,
<enable> IN BOOLEAN DEFAULT TRUE,
<regexp_pattern> IN VARCHAR2 DEFAULT NULL,
<regexp_replace_string> IN VARCHAR2 DEFAULT NULL,
<regexp_position> INTEGER DEFAULT DBMS_REDACT.RE_BEGINNING,
<regexp_occurrence> INTEGER DEFAULT DBMS_REDACT.RE_ALL,
<regexp_match_parameter> IN VARCHAR2 DEFAULT NULL,
<custom_function_expression> IN VARCHAR2 DEFAULT NULL
)

参数

参数名称

描述

object_schema

指定对象所在的模式名称,不指定则是current_user的默认schema。

object_name

创建数据脱敏策略的表的名称。

policy_name

需要添加的策略的名称。每个表上策略名称不可重复。

policy_description

指定脱敏策略的描述。

column_name

脱敏策略适用的列的名称。

说明

如果需要脱敏多个列,请使用alter_policy存储过程添加其他列。

column_description

需要脱敏的列的描述。

说明

目前column_description暂不支持,当您指定列的描述时,将收到一条警告消息。

function_type

要使用的脱敏函数的类型。可能的值如下:

  • NONE:不进行脱敏,对表的查询结果无影响。

  • FULL:完全脱敏,脱敏列数据的完整值。

  • PARTIAL:部分脱敏,脱敏列数据的一部分。

  • RANDOM:随机脱敏,根据列的数据类型,每个查询都会产生不同的随机值。

  • REGEXP:基于正则表达式的脱敏,搜索需要脱敏的数据模式。

  • CUSTOM:自定义脱敏类型。

function_parameters

指定分区脱敏的函数参数,仅适用于部分脱敏。

expression

指定表的布尔表达式并确定如何应用策略。如果此策略表达式的计算结果为true ,则会使用脱敏策略。

enable

用于控制策略的启用或禁用。默认为TRUE,取值如下:

  • 设置为TRUE时,策略在创建时启用。

  • 设置为FALSE时,策略被禁用,但可以通过调用enable_policy过程来启用策略。

regexp_pattern

指定用于脱敏数据的正则表达式模式。如果regexp_pattern不匹配,则返回NULL。

regexp_replace_string

指定替换字符串值。

regexp_position

指定搜索必须开始的字符位置。默认情况下,函数参数是RE_BEGINNING

regexp_occurrence

指定子字符串的替换出现。

  • 如果常量是RE_ALL,则替换每个匹配的子字符串。

  • 如果常量是RE_FIRST,则替换第一个匹配的子字符串。

regexp_match_parameter

更改函数的默认匹配行为。regexp_match_parameter常量可能的取值如下:

  • RE_CASE_SENSITIVE:通过正则表达式进行匹配时,区分列数据的大小写。

  • RE_CASE_INSENSITIVE:通过正则表达式进行匹配时,不区分列数据的大小写。

  • RE_MULTIPLE_LINES:将源字符串视为多行,如果忽略此参数,则表示为单行。

  • RE_NEWLINE_WILDCARD:指定句号.,如果忽略此参数,则句号与换行符不匹配。

  • RE_IGNORE_WHITESPACE:忽略空白字符。

custom_function_expression

仅适用于脱敏的CUSTOM类型。custom_function_expression是一个函数表达式,即具有参数的模式限定函数,例如,schema_name.function_name (argument1, …)允许您使用其脱敏逻辑来脱敏列数据。

ALTER_POLICY

ALTER_POLICY将修改表的现有数据脱敏策略。

ALTER_POLICY (
<object_schema> IN VARCHAR2 DEFAULT NULL,
<object_name> IN VARCHAR2,
<policy_name> IN VARCHAR2,
<action> IN INTEGER DEFAULT DBMS_REDACT.ADD_COLUMN,
<column_name> IN VARCHAR2 DEFAULT NULL,
<function_type> IN INTEGER DEFAULT DBMS_REDACT.FULL,
<function_parameters> IN VARCHAR2 DEFAULT NULL,
<expression> IN VARCHAR2 DEFAULT NULL,
<regexp_pattern> IN VARCHAR2 DEFAULT NULL,
<regexp_replace_string> IN VARCHAR2 DEFAULT NULL,
<regexp_position> IN INTEGER DEFAULT DBMS_REDACT.RE_BEGINNING,
<regexp_occurrence> IN INTEGER DEFAULT DBMS_REDACT.RE_ALL,
<regexp_match_parameter> IN VARCHAR2 DEFAULT NULL,
<policy_description> IN VARCHAR2 DEFAULT NULL,
<column_description> IN VARCHAR2 DEFAULT NULL,
<custom_function_expression> IN VARCHAR2 DEFAULT NULL
)

参数

参数名称

描述

object_schema

指定对象所在的模式名称,以及在该对象上的策略所在的模式名称。不指定则是current_user的默认schema。

object_name

需要更改数据脱敏策略的表的名称。

policy_name

需要更改的策略的名称。

action

需要执行的操作。

column_name

脱敏策略适用的列的名称。

function_type

需要使用的脱敏函数的类型。可能的值如下:

  • NONE:不进行脱敏,对表的查询结果无影响。

  • FULL:完全脱敏,脱敏列数据的完整值。

  • PARTIAL:部分脱敏,脱敏列数据的一部分。

  • RANDOM:随机脱敏,根据列的数据类型,每个查询都会产生不同的随机值。

  • REGEXP:基于正则表达式的脱敏,搜索需要脱敏的数据模式。

  • CUSTOM:自定义脱敏类型。

function_parameters

指定脱敏函数的函数参数。

expression

指定表的布尔表达式并确定如何应用策略。如果此策略表达式的计算结果为TRUE,则会发生脱敏策略.

regexp_pattern

允许使用正则表达式来脱敏数据。如果regexp_pattern与数据不匹配,则

返回NULL。

regexp_replace_string

指定替换字符串值。

regexp_position

指定搜索必须开始的字符位置。默认情况下,函数参数是RE_BEGINNING。

regexp_occurence

指定子字符串的替换出现。

  • 如果常量是RE_ALL,则替换每个匹配的子字符串。

  • 如果常量是RE_FIRST,则替换第一个匹配的子字符串。

regexp_match_parameter

更改函数的默认匹配行为。regexp_match_parameter可能的常量如下:

    • RE_CASE_SENSITIVE:通过正则表达式进行匹配时,区分列数据的大小写。

    • RE_CASE_INSENSITIVE:通过正则表达式进行匹配时,不区分列数据的大小写。

    • RE_MULTIPLE_LINES:将源字符串视为多行,如果忽略此参数,则表示为单行。

    • RE_NEWLINE_WILDCARD:指定句号.,如果忽略此参数,则句号与换行符不匹配。

    • RE_IGNORE_WHITESPACE:忽略空白字符。

policy_description

指定脱敏策略的描述。

column_description

需要脱敏的列的描述。

说明

目前column_description暂不支持,如果您指定列的描述,您将收到一条警告消息。

custom_function_expression

custom_function_expression仅适用于脱敏CUSTOM类型。custom_function_expression是一个函数表达式,即具有参数的模式限定函数,例如,schema_name.function_name (argument1, …)允许您使用其脱敏逻辑来脱敏列数据。

DISABLE_POLICY

DISABLE_POLICY禁用现有的数据脱敏策略。

DISABLE_POLICY (
<object_schema> IN VARCHAR2 DEFAULT NULL,
<object_name> IN VARCHAR2,
<policy_name> IN VARCHAR2
)

参数

参数名称

描述

object_schema

指定对象所在的模式名称,以及该对象上的策略所在的模式名称。不指定则是current_user的默认schema。

object_name

需要禁用数据脱敏策略的表的名称。

policy_name

需要禁用的策略的名称。

ENABLE_POLICY

ENABLE_POLICY启用先前禁用的数据脱敏策略。

ENABLE_POLICY (
<object_schema> IN VARCHAR2 DEFAULT NULL,
<object_name> IN VARCHAR2,
<policy_name> IN VARCHAR2
)

参数

参数名称

描述

object_schema

指定对象所在的模式名称,以及该对象上的策略所在的模式名称。不指定则是current_user的默认schema。

object_name

需要对其启用数据脱敏策略的表的名称。

policy_name

需要启用的策略的名称。

DROP_POLICY

DROP_POLICY通过从表中删除屏蔽策略来删除数据脱敏策略。

DROP_POLICY(
<object_schema> IN VARCHAR2 DEFAULT NULL,
<object_name> IN VARCHAR2,
<policy_name> IN VARCHAR2
)

参数

参数名称

描述

object_schema

指定对象所在的schema名称,以及将应用数据脱敏策略的schema名称。不指定则是current_user的默认schema。

object_name

需要从表中删除数据脱敏策略的表的名称。

policy_name

需要删除的策略的名称。

UPDATE_FULL_REDACTION_VALUES

UPDATE_FULL_REDACTION_VALUES更新数据脱敏策略的默认显示值,并且可以通过redaction_values_for_type_full视图查看这些默认值。

UPDATE_FULL_REDACTION_VALUES (
<number_val> IN NUMBER DEFAULT NULL,
<binfloat_val> IN FLOAT4 DEFAULT NULL,
<bindouble_val> IN FLOAT8 DEFAULT NULL,
<char_val> IN CHAR DEFAULT NULL,
<varchar_val> IN VARCHAR2 DEFAULT NULL,
<nchar_val> IN NCHAR DEFAULT NULL,
<nvarchar_val> IN NVARCHAR2 DEFAULT NULL,
<datecol_val> IN DATE DEFAULT NULL,
<ts_val> IN TIMESTAMP DEFAULT NULL,
<tswtz_val> IN TIMESTAMPTZ DEFAULT NULL,
<blob_val> IN BLOB DEFAULT NULL,
<clob_val> IN CLOB DEFAULT NULL,
<nclob_val> IN CLOB DEFAULT NULL
)

参数

参数名称

描述

number_val

更新NUMBER数据类型的默认值。

binfloat_val

更新的值可以是FLOAT4数据类型的任意值。目前暂不支持二进制浮点数据类型。

bindouble_val

更新的值可以是FLOAT8数据类型的任意值。目前暂不支持二进制双精度数据类型。

char_val

更新CHAR数据类型的默认值。

varchar_val

更新VARCHAR2数据类型的默认值。

nchar_val

nchar_val映射到CHAR数据类型并返回CHAR值。

nvarchar_val

nvarchar_val映射到VARCHAR2数据类型并返回VARCHAR值。

datecol_val

更新DATE数据类型的默认值。

ts_val

更新TIMESTAMP数据类型的默认值。

tswtz_val

更新TIMESTAMPTZ数据类型的默认值。

blob_val

更新BLOB数据类型的默认值。

clob_val

更新CLOB数据类型的默认值。

nclob_val

nclob_val映射到CLOB数据类型并返回CLOB值。

示例

ADD_POLICY

通过对表添加策略,使得其他用户访问该表时数据发生混淆。

  1. 准备测试数据,创建测试表格payment_details_tab与测试用户redact_user。

    ---创建测试表格payment_details_tab
    CREATE TABLE payment_details_tab (
     customer_id NUMBER NOT NULL, 
     card_string VARCHAR2(19) NOT NULL);
    INSERT INTO payment_details_tab VALUES (4001,'2345-2345-2345-2345');
    
    ---创建测试用户redact_user并授权
    CREATE USER redact_user PASSWORD '1234';
    GRANT SELECT ON payment_details_tab TO redact_user;
  2. 执行如下语句,对测试表格payment_details_tab添加策略。

    CALL DBMS_REDACT.add_policy(
      object_schema => 'public', 
      object_name => 'payment_details_tab', 
      policy_name => 'redactPolicy_001', 
      policy_description => 'redactPolicy_001 for payment_details_tab table', 
      column_name => 'customer_id', 
      function_type => DBMS_REDACT.full, 
      expression => '1=1', 
      enable => TRUE 
    );
  3. 执行如下语句,切换至测试用户redact_user,并查询表格。

    ---切换连接数据库用户
    \c - redact_user
    
    ---执行如下查询语句
    SELECT customer_id from payment_details_tab order by 1;

    查询语句返回结果如下:

     customer_id 
    -------------
               0
    (1 row)

ALTER_POLICY

通过变更policy的定义,对要显示的字符串数据进行脱敏处理。

  1. 执行如下语句,变更测试表格payment_details_tab策略的定义。

    CALL DBMS_REDACT.alter_policy(
      object_schema => 'public', 
      object_name => 'payment_details_tab', 
      policy_name => 'redactPolicy_001',
      action => DBMS_REDACT.ADD_COLUMN,
      column_name => 'card_string', 
      function_type => DBMS_REDACT.partial, 
      function_parameters => DBMS_REDACT.REDACT_CCN16_F12
    );
  2. 执行如下语句,切换至测试用户redact_user,并查询表格。

    ---切换连接数据库用户
    \c - redact_user
    
    ---执行如下查询语句
    SELECT * FROM payment_details_tab;

    查询语句返回结果如下:

     customer_id |     card_string     
    -------------+---------------------
               0 | ****-****-****-2345
    (1 row)

DISABLE_POLICY

通过关闭policy,使得其他用户可以查看正常的表数据。

  1. 执行如下语句,关闭测试表格payment_details_tab上的策略。

    CALL DBMS_REDACT.disable_policy(
      object_schema => 'public', 
      object_name => 'payment_details_tab', 
      policy_name => 'redactPolicy_001'
    );
  2. 执行如下语句,切换至测试用户redact_user,并查询表格。

    ---切换连接数据库用户
    \c - redact_user
    
    ---执行如下查询语句
    SELECT * FROM payment_details_tab;

    查询语句返回结果如下:

     customer_id |     card_string     
    -------------+---------------------
            4001 | 2345-2345-2345-2345
    (1 row)

ENABLE_POLICY

通过重新启用policy,使得policy对其他用户生效。

  1. 执行如下语句,重新启用测试表格payment_details_tab上的策略。

    CALL DBMS_REDACT.enable_policy(
      object_schema => 'public', 
      object_name => 'payment_details_tab', 
      policy_name => 'redactPolicy_001'
    );
  2. 执行如下语句,切换至测试用户redact_user,并查询表格。

    ---切换连接数据库用户
    \c - redact_user
    
    ---执行如下查询语句
    SELECT * FROM payment_details_tab;

    查询语句返回结果如下:

     customer_id |     card_string     
    -------------+---------------------
               0 | ****-****-****-2345
    (1 row)

DROP_POLICY

通过DROP_POLICY,移除表上的脱敏策略。

  1. 执行如下语句,删除测试表格payment_details_tab上的策略。

    CALL DBMS_REDACT.drop_policy(
      object_schema => 'public', 
      object_name => 'payment_details_tab', 
      policy_name => 'redactPolicy_001'
    );
  2. 执行如下语句,切换至测试用户redact_user,并查询表格。

    ---切换连接数据库用户
    \c - redact_user
    
    ---执行如下查询语句
    SELECT * FROM payment_details_tab;

    查询语句返回结果如下:

     customer_id |     card_string     
    -------------+---------------------
            4001 | 2345-2345-2345-2345
    (1 row)

UPDATE_FULL_REDACTION_VALUES

通过变更某一类型的脱敏值,来替换将要混淆的数据。例如,将混淆数据由0变为9999999。

说明

以下操作需要使用超级用户执行,如您有相应场景,请联系我们处理。

  1. 执行如下语句,变更测试表格payment_details_tab上的脱敏值,用于替换将要混淆的数据。

    CALL DBMS_REDACT.update_full_redaction_values (
      number_val => 9999999,
      char_val => 'Z',
      varchar_val => 'V',
      datecol_val => to_date('17/10/2023', 'DD/MM/YYYY'),
      ts_val => to_timestamp('17/10/2023 11:12:13', 'DD/MM/YYYY HH24:MI:SS'),
      tswtz_val => NULL,
      blob_val => 'NEW REDACTED VALUE',
      clob_val => 'NEW REDACTED VALUE'
    );
  2. 执行如下语句,切换至测试用户redact_user,并查询表格。

    ---切换连接数据库用户
    \c - redact_user
    
    ---执行如下查询语句
    SELECT * FROM payment_details_tab;

    查询语句返回结果如下:

     customer_id |     card_string     
    -------------+---------------------
         9999999 | 2345-2345-2345-2345
    (1 row)