oracle vpd 实验攻略及三个oracle错误(ORA-01031 ORA-06512 ORA-28112)

--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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值