--1、创建oracle环境上下文设置函数和策略应用函数。
SQL> CREATE OR REPLACE PACKAGE yangxl AS
2 --环境上下文设置
3 PROCEDURE Set_Context;
4
5 --策略函数
6 function f_ic10 return varchar2;
7 END yangxl;
8 /
Package created
SQL> CREATE OR REPLACE PACKAGE BODY yangxl IS
2
3 --环境上下文设置
4 PROCEDURE Set_Context IS
5 BEGIN
6 DBMS_Session.Set_Context(user, 'aab001', '13040100004');
7 END Set_Context;
8
9 --策略函数
10 function f_ic10 return varchar2 is
11 Result varchar2(100);
12 v_aab001 varchar2(20);
13 begin
14 v_aab001 := sys_context(user, 'aab001');
15 if v_aab001 is not null then
16 Result := 'aab001 = ''' || v_aab001 || '''';
17 else
18 Result := '1=1';
19 end if;
20 return(Result);
21 end f_ic10;
22 END yangxl;
23 /
Package body created
2、给用户授权
--连接超级用户
SQL> conn sys/oracle@orcl as sysdba
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
--授予创建上下文权限
SQL> grant create any context to hdtest;
Grant succeeded
--把dbms_rls执行权限授予hdtest用户
SQL> grant execute on dbms_rls to hdtest;
Grant succeeded
--3、没有控制权限前ic10表数据。
SQL> select count(1) from ic10;
COUNT(1)
----------
135168
--4、实施权限控制。
SQL> exec yangxl.Set_Context;
begin yangxl.Set_Context; end;
ORA-01031: 权限不足
ORA-06512: 在 "SYS.DBMS_SESSION", line 90
ORA-06512: 在 "HDTEST.YANGXL", line 6
ORA-06512: 在 line 2
--执行下面语句,让yangxl这个包去创建上下文环境变量。
SQL> create context hdtest using yangxl;
Context created
--设置上下文环境变量
SQL> exec yangxl.Set_Context;
PL/SQL procedure successfully completed
--把权限函数
SQL> exec DBMS_Rls.Add_Policy('hdtest','ic10','yxl_policy','hdtest','yangxl.f_ic10 ');
PL/SQL procedure successfully completed
SQL> select policy_name,object_name from user_policies;
POLICY_NAME OBJECT_NAME
------------------------------ ------------------------------
YXL_POLICY
SQL> select count(1) from ic10;
select count(1) from ic10
ORA-28112: 无法执行策略函数
--出现这个错误的原因是策略函数必须要求两个入参,一个入参是schema对象,一个table对象,虽然可以不用。
SQL>
SQL> CREATE OR REPLACE PACKAGE yangxl AS
2 --环境上下文设置
3 PROCEDURE Set_Context;
4
5 --策略函数
6 function f_ic10(prm_schema varchar2, prm_table varchar2) return varchar2;
7 END yangxl;
8 /
Package created
SQL> CREATE OR REPLACE PACKAGE BODY yangxl IS
2 --环境上下文设置
3 PROCEDURE Set_Context IS
4 BEGIN
5 DBMS_Session.Set_Context(user, 'aab001', '13040100004');
6 END Set_Context;
7 --策略函数
8 function f_ic10(prm_schema varchar2, prm_table varchar2) return varchar2 is
9 Result varchar2(100);
10 v_aab001 varchar2(20);
11 begin
12 v_aab001 := sys_context(user, 'aab001');
13 if v_aab001 is not null then
14 Result := 'aab001 = ''' || v_aab001 || '''';
15 else
16 Result := '1=1';
17 end if;
18 return(Result);
19 end f_ic10;
20 END yangxl;
21 /
Package body created
--现在查询一下,只有1667人了。
SQL> select count(1) from ic10;
COUNT(1)
----------
1667
--总结,其实vpd的实现本质就是自动给基表加WHERE条件。了解了这个原理,一切就简单了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7204674/viewspace-623951/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7204674/viewspace-623951/