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 错误