首页 > 代码库 > VPD

VPD

虚拟专用数据库 (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;