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_name | 待添加策略的表的名称。 |
policy_name | 待添加的策略名称。对于同一个表,它必须是唯一的。 |
function_schema | (可选参数)策略函数的模式(NULL表示使用当前默认的模式)。如果没有指定 |
policy_function | 为策略生成谓词的函数的名称。如果函数是在包中定义的,那么包的名称必须存在。 |
statement_types | (可选参数)策略适用的语句类型。它可以是任意组合 |
update_check | (可选参数)对于 |
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_opt | (可选参数)设置为 |
示例
该示例展示了如何添加一个新的访问控制策略。
-- 创建测试表
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_name | 待启用/禁用策略所在表的名称。 |
policy_name | 待启用/禁用的策略名称。 |
enable | 启用或禁用该策略。取值如下:
|
示例
该示例展示了如何启用/禁用策略。
-- 禁用策略
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_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)