zoukankan      html  css  js  c++  java
  • EBS技术开发之VPD策略

    VPD (虚拟专用数据库的简称),主要作用是根据运行环境的上下文,隐式的添加条
    件。 好处是在数据库层解决细粒度的角色权限访问,避免在中间层写大量代码;坏处
    是数据屏蔽的逻辑太隐蔽了,对于分析查找问题带来一定的困扰

    一个简单的例子带你体验VPD策略

    --1、在APPS 中创建表,赋权给PO, ONT用户
    create table hand_vpd_test_tb1
    (column1  varchar2(30),
     db_user  varchar2(30)
     )
    
    grant select ,insert, update on hand_vpd_test_tb1 to po,ont;
    
    
     
    --2、创建策略函数 package
    --使用 hand_vpd_tst_security.pck 创建策略函数包
    --赋权
    grant execute on  apps.hand_vpd_tst_security to public;
    CREATE PUBLIC SYNONYM hand_vpd_tst_security FOR apps.hand_vpd_tst_security;
     
    --3、添加VPD策略 
    begin
      
     DBMS_Rls.Add_Policy('APPS', 'HAND_VPD_TEST_TB1', 'INSERT_POLICY','APPS', 'HAND_VPD_TST_SECURITY.INSERT_SECURITY','INSERT', TRUE);
    
     DBMS_Rls.Add_Policy('APPS', 'HAND_VPD_TEST_TB1', 'SELECT_POLICY','APPS', 'HAND_VPD_TST_SECURITY.SELECT_SECURITY','SELECT');
    
    end;
    
    select * from DBA_POLICIES a where a.object_name = 'HAND_VPD_TEST_TB1';
    
    -- 删除VPD策略(备用)
    begin
      dbms_rls.drop_policy('APPS','HAND_VPD_TEST_TB1','USER_DATA_INSERT_POLICY');
      dbms_rls.drop_policy('APPS','HAND_VPD_TEST_TB1','USER_DATA_SELECT_POLICY');
    end;  
      
    
    --4、Select , Insert  测试
    begin
     insert into hand_vpd_test_tb1 values ('test1-po','PO');
     insert into hand_vpd_test_tb1 values ('test1-ont','ONT');
    end;
    
    --5、切换到 PO 用户登录
    select * from apps.hand_vpd_test_tb1
    --结果:
    --策略函数执行出错: 
    
    --trace 发现是ora-06550错误,
    select value from v$parameter where name = 'user_dump_dest';
    alter session set tracefile_identifier = 'Hand_vpd_test2';
    alter session set sql_trace=true;
    select * from apps.hand_vpd_test_tb1
    alter session set sql_trace=false;
    
    --表面是SELECT_SECURITY未声明,实际是XX用户执行策略函数时需要访问被施加策略的对象:hand_vpd_test_tb1,因为对该对象无权限,而导致报此错误;
    --解决方案
    grant select ,insert, update on hand_vpd_test_tb1 to public;
    
    --6 再次测试:
    -- 切换到 PO 用户登录
    select * from apps.hand_vpd_test_tb1
    --结果只出现  DB_USER=PO的记录;
    
    --7 做insert 测试
    
     insert into apps.hand_vpd_test_tb1 values ('test1-po','PO');
     --结果:顺利插入
     insert into apps.hand_vpd_test_tb1 values ('test1-ont','ONT');
     --结果:报 ORA-28115: policy with check option violation 错误
    


     

  • 相关阅读:
    BZOJ3697: 采药人的路径
    解题:WC 2007 石头剪刀布
    解题:CQOI 2017 老C的方块
    解题:洛谷4314 CPU监控
    解题:CQOI 2017 老C的任务
    解题:CF1009 Dominant Indices
    解题:CF570D Tree Requests
    解题:APIO 2012 派遣
    解题:ZJOI 2015 幻想乡战略游戏
    解题:洛谷4178 Tree
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299550.html
Copyright © 2011-2022 走看看