VPD--Virtual Private Database / Oracle Policy

cooler發表於2009-01-12
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章