DBMS_RLS包

DBMS_RLS 系统包提供了创建策略、启/禁用策略、删除策略等接口,这些接口用来实现 VPD 安全策略的功能。

DBMS_RLS 提供基于动态谓词的控制访问。在每次解析 DML 语句时,都会去获取表上策略对应的动态谓词,动态谓词是由策略所指定的PL函数返回的,例如:

--清理环境
DROP FUNCTION func(VARCHAR2, VARCHAR2);
DROP TABLE user1.tab CASCADE;
DROP USER user1;

create user user1 with password '123456Hh';
CREATE TABLE user1.tab (a int);
insert into user1.tab values(1);

CREATE OR REPLACE FUNCTION func(OBJECT_SCHEMA VARCHAR2, OBJECT_NAME VARCHAR2)
    RETURN VARCHAR2 IS
BEGIN
    --这里简单的返回一个条件
    RETURN 'A != 1';


END;
/

EXEC DBMS_RLS.ADD_POLICY(OBJECT_SCHEMA => 'user1',
                    OBJECT_NAME => 'tab',
                    POLICY_NAME => 'tab_policy',
                    STATEMENT_TYPES => 'SELECT',
                    POLICY_FUNCTION => 'func');

         

只要在查询或子查询语句访问到 user1 模式下的 tab 表,数据库就会调用 user1 模式下的 func 函数,函数会返回一个字符串,数据库会产生一个如下“临时视图”:

SELECT * FROM user1.tab WHERE A != 1;                   
A(int)      |
总数目:0

会在以前引用 tab 表的地方,转为引用这个“临时视图”

同样,DBMS_RLS 提供了接口来删除或禁用安全策略,例如,可以调用以下接口删除、禁用或启用 tab_policy 策略

EXEC DBMS_RLS.ENABLE_POLICY('user1', 'tab', 'tab_policy', FALSE); 

EXEC DBMS_RLS.DROP_POLICY('user1', 'tab', 'tab_policy');
                 
--删除
DROP FUNCTION func(VARCHAR2, VARCHAR2);
DROP TABLE user1.tab CASCADE;
DROP USER user1;

注解

神通只支持在表上添加策略,而 ORACLE 支持在视图上添加。

添加策略时可以指定语句类型,只有在以指定语句类型访问到表时,才会生成动态谓词。

神通支持指定的类型包括 :SELECT、INSERT、UPDATE、DELETE。

以下是 DBMS_RLS 包目前支持的接口

接口 说明
ADD_POLICY 添加一条 VPD 安全策略
DROP_POLICY 删除一条 VPD 安全策略
ENABLE_POLICY 启用或禁用一条 VPD 安全策略

参见:

VPD安全策略