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 安全策略 |
参见: