DBMS_RLS系统包提供了向表添加细粒度访问控制策略的支持,能够灵活地隔离数据。

DBMS_RLS子程序总览

子程序

说明

ADD_POLICY Procedure

向表添加细粒度的访问控制策略。

ENABLE_POLICY Proceduree

启用或禁用一个细粒度的访问控制策略。

DROP_POLICY Procedure

从表中删除细粒度的访问控制策略。

ADD_POLICY Procedure

该存储过程用于向表中添加细粒度的访问控制策略。

语法

DBMS_RLS.ADD_POLICY ( 
   object_schema            IN  VARCHAR2       DEFAULT NULL,
   object_name              IN  VARCHAR2,
   policy_name              IN  VARCHAR2,
   function_schema          IN  VARCHAR2       DEFAULT NULL,
   policy_function          IN  VARCHAR2,
   statement_types          IN  VARCHAR2       DEFAULT NULL,
   update_check             IN  BOOLEAN        DEFAULT FALSE,
   enable                   IN  BOOLEAN        DEFAULT TRUE,
   static_policy            IN  BOOLEAN        DEFAULT FALSE,
   policy_type              IN  BINARY_INTEGER DEFAULT NULL,
   long_predicate           IN  BOOLEAN        DEFAULT FALSE,
   sec_relevant_cols        IN  VARCHAR2       DEFAULT NULL,
   sec_relevant_cols_opt    IN  BINARY_INTEGER DEFAULT NULL); 

参数说明

参数

说明

object_schema

(可选参数)包含表的模式。如果没有指定object_schema,则使用当前用户的模式。

object_name

待添加策略的表的名称。

policy_name

待添加的策略名称。对于同一个表,它必须是唯一的。

function_schema

(可选参数)策略函数的模式(NULL表示使用当前默认的模式)。如果没有指定function_schema,则使用当前用户的模式。

policy_function

为策略生成谓词的函数的名称。如果函数是在包中定义的,那么包的名称必须存在。

statement_types

(可选参数)策略适用的语句类型。它可以是任意组合SELECTINSERTUPDATEDELETE。默认值为SELECT UPDATE DELETE

update_check

(可选参数)对于INSERTUPDATE语句类型的可选参数。默认值为FALSE,设置update_check为TRUE后会导致PolarDB检测插入或更新后的值。

enable

(可选参数)指示添加时是否启用该策略。默认值为TRUE。

static_policy

(可选参数)默认值为FALSE,如果设置为TRUE,则策略函数为访问该对象的任何人生成相同的谓词字符串。PolarDB仅做参数兼容。

policy_type

(可选参数)默认值为NULL,表示policy_type由static_policy的值决定。指定policy类型后,会覆盖static_policy的值。PolarDB仅做参数兼容。

long_predicate

(可选参数)默认值为FALSE,表示策略函数可以返回长度最多为4000字节的谓词。TRUE表示谓词文本字符串的长度可以达到32K字节。PolarDB仅做参数兼容。

sec_relevant_cols

(可选参数)启用列级虚拟隐私数据库(VPD),在查询中引用包含sec_relevant_cols定义的列时强制执行安全策略,多个列名使用逗号分隔。默认为对象的所有用户定义列。

sec_relevant_cols_opt

(可选参数)设置为DBMS_RLS.ALL_ROWS时,不满足当前策略时sec_relevant_cols中定义的列显示为NULL,其余列正常显示。设置为NULL时,不满足当前策略时,整行均不显示。默认为NULL。

示例

该示例展示了如何添加一个新的访问控制策略。

-- 创建测试表
CREATE TABLE t(a int, b int);
INSERT INTO t VALUES (1, 2);
INSERT INTO t VALUES (10, 20);
INSERT INTO t VALUES (100, 200);

-- 创建策略函数
CREATE OR REPLACE FUNCTION f(obj_schema varchar2, obj_name varchar2)
RETURN varchar2 IS
BEGIN
  RETURN 'a < 10';
END;

-- 添加策略
BEGIN
DBMS_RLS.ADD_POLICY(object_name => 't',
                    policy_name => 'p',
                    policy_function => 'f',
                    statement_types => 'select',
                    sec_relevant_cols => 'b',
                    sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS);
END;

-- 查询数据,在 a<10 时会显示 b,其他行的 b 不显示
SELECT * FROM t ORDER BY b;
  a  | b
-----+---
   1 | 2
  10 |
 100 |
(3 rows)

ENABLE_POLICY Procedure

该存储过程用于启用/禁用一个细粒度的访问控制策略。

语法

DBMS_RLS.ENABLE_POLICY (
   object_schema IN VARCHAR2 NULL,
   object_name   IN VARCHAR2,
   policy_name   IN VARCHAR2,
   enable        IN BOOLEAN TRUE);

参数说明

参数

说明

object_schema

(可选参数)包含表的模式。如果没有指定object_schema,则使用当前用户的模式。

object_name

待启用/禁用策略所在表的名称。

policy_name

待启用/禁用的策略名称。

enable

启用或禁用该策略。取值如下:

  • TRUE(默认):启用该策略。

  • FALSE:禁用该策略。

示例

该示例展示了如何启用/禁用策略。

-- 禁用策略
BEGIN
DBMS_RLS.ENABLE_POLICY(object_name => 't',
                       policy_name => 'p',
                       enable => 'f');
END;

-- 查询数据,a b 均完整显示
SELECT * FROM t ORDER BY b;
  a  |  b
-----+-----
   1 |   2
  10 |  20
 100 | 200
(3 rows)

-- 启用策略
BEGIN
DBMS_RLS.ENABLE_POLICY(object_name => 't',
                       policy_name => 'p',
                       enable => 't');
END;

-- 查询数据,在 a<10 时会显示 b,其他行的 b 不显示
SELECT * FROM t ORDER BY b;
  a  | b
-----+---
   1 | 2
  10 |
 100 |
(3 rows)

DROP_POLICY Procedure

该存储过程用于删除表中的细粒度访问控制策略。

语法

DBMS_RLS.DROP_POLICY (
   object_schema   IN VARCHAR2 NULL,
   object_name     IN VARCHAR2,
   policy_name     IN VARCHAR2);

参数说明

参数

说明

object_schema

(可选参数)包含表的模式。如果没有指定object_schema,则使用当前用户的模式。

object_name

待删除策略所在表的名称。

policy_name

待删除的策略名称。

示例

该示例展示了如何删除指定的策略。

-- 删除策略
BEGIN
DBMS_RLS.DROP_POLICY(object_name => 't',
                     policy_name => 'p');
END;

-- 查询数据,a b 均完整显示
SELECT * FROM t ORDER BY b;
  a  |  b
-----+-----
   1 |   2
  10 |  20
 100 | 200
(3 rows)