VPD--Virtual Private Database / Oracle Policy

VPD--Virtual Private Database / Oracle Policy[@more@]

1. 说明
Policy应用于数据行访问权限控制时,其作用简而言之,就是在查询数据表时,自动在
查询结果上加上一个Where子句。如果该查询已有where子句,则在该Where子句后面
加上"And ..."。
由Oracle Policy自动加入的Where子句的内容,通常由一个函数来实现。


2. 实例:授权
简单起见我们用apps用户做测试,不用授权。如果用其它用户,比如FWK用户做测
试,需要用system用户登录授权:
grant execute on dbms_rls to fwk;
3. 实例:创建表和测试数据
create table dept as select * from scott.dept;
create table emp as select * from scott.emp;


4. 实例:创建策略函数

CREATE OR REPLACE FUNCTION t_vpd_dept_security(obj_schema VARCHAR2, obj_name VARCHAR2)
RETURN VARCHAR2 IS
BEGIN
IF sys_context('USERENV','CURRENT_USER') = 'APPS' THEN
--VPD只会统一报ORA-28112: failed to execute policy function
--raise_application_error(-20001, '你没有权限更新');
RETURN 'deptno = 10';
ELSE
RETURN '2 = 2';
END IF;
END;

5. 实例:添加策略到表
BEGIN
BEGIN
dbms_rls.drop_policy(object_schema => 'apps',
--数据表(或视图)所在的Schema名称
object_name => 'dept',
--数据表(或视图)的名称
policy_name => 't_vpd_dept_policy'
--POLICY的名称,主要用于将来对Policy的管理
);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
dbms_rls.add_policy(object_schema => 'apps',
--数据表(或视图)所在的Schema名称
object_name => 'dept',
--数据表(或视图)的名称
policy_name => 't_vpd_dept_policy',
--POLICY的名称,主要用于将来对Policy的管理
function_schema => 'apps',
--返回Where子句的函数所在Schema名称
policy_function => 't_vpd_dept_security',
--返回Where子句的函数名称
statement_types => 'select',
--要使用该Policy的DML类型,如'Select,Insert,Update,Delete'
update_check => FALSE,
--仅适用于Statement_Type为'Insert,Update',值为'True'或'False'
enable => TRUE
--是否启用,值为'True'或'False'
);
END;


6. 实例:测试
执行下面语句:
select * from dept d, emp e where d.deptno = e.deptno

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/93880/viewspace-1016027/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/93880/viewspace-1016027/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值