虚拟专用数据库 (VPD) 提供了角色和视图无法提供的行级访问控制。
将一个或多个安全策略与表或视图关联后,就可以实现虚拟专用数据库。
对带安全策略的表进行直接或间接访问时,数据库将调用一个实施该策略的函数。策略函数返回一个访问条件(WHERE
子句),即谓词。应用程序将它附加到用户的 SQL 语句,从而动态修改用户的数据访问权限。
eg1:
--管理员用户进行授权
grant execute on dbms_rls to scott;
--创建测试表
create table t (id number);
insert into t values (1);
insert into t
values (2);
insert into t values (3);
insert into t values (4);
commit;
--创建策略函数(返回值作为where条件 ,同下:select * from
t where id<=3 )
CREATE OR REPLACE FUNCTION f_limited_query_t (s_schema IN
VARCHAR2, s_object IN VARCHAR2) RETURN VARCHAR2
AS
BEGIN
RETURN ‘ID <= 3‘;
END;
--将策略函数与表相关联
BEGIN
DBMS_RLS.add_policy (object_schema
=> ‘SCOTT‘,
-- 数据表(或视图)所在的Schema名称
object_name => ‘T‘,
--
数据表(或视图)的名称
policy_name => ‘POLICY_LIMITED_QUERY_T‘,
--
政策名称
function_schema => ‘SCOTT‘,
--返回Where子句的函数所在Schema名称
policy_function => ‘F_LIMITED_QUERY_T‘);
--返回Where子句的函数名称
END;
--测试
分别用管理员和SCOTT账户登录查询:
select * from scott.t;
--查询策略
SELECT * FROM User_Policies
--删除策略
BEGIN
DBMS_RLS.drop_policy (object_schema =>
‘SCOTT‘,
object_name =>
‘T‘,
policy_name => ‘POLICY_LIMITED_QUERY_T‘);
END;
--再测试
分别用管理员和SCOTT账户登录查询:
select * from scott.t;