Oracle的虛擬私有數據庫特性(也稱作細顆粒度存取控制)對諸如SELECT等數據管理語言DML語句提供行級安全性檢查PL/SQL策略函數和某個數據表相關聯這個函數可以檢查當前用戶的上下文背景並添加查詢中WHERE語句的條件(斷言)一個用戶或者應用可以這樣來寫
SELECT * FROM employees;
但是實際上oracle將會執行這樣的語句
SELECT * FROM employees
WHERE department_id = ;
因此只有在查尋范圍之內的行(在department數據表中的前行)才會被查詢語句返回利用oracle g中的新選項可以讓oracle返回所有行而不僅僅是被授權的行然而未被授權行中包含的某些列(稱為安全相關列)將顯示NULL來代替實際數據而其它的列值將會正常顯示
要想使用列值掩碼必須在虛擬私有數據庫策略中做兩件事
首先必須創建一個列級策略來設計某些列為安全相關列其次必須在查詢中包含ALL_ROWS選項以用來返回所有行這兩個參數的結合就可以實現列值掩碼
CREATE OR REPLACE
FUNCTION rls_dept
(obj_owner IN VARCHAR obj_name IN VARCHAR)
RETURN VARCHAR
AS
predicate
VARCHAR ();
BEGIN
predicate := department_id = ;
RETURN (predicate);
END rls_dept;
/
列表A
列表A顯示了一個稱為rls_dept的策略函數它返回斷言department_id=用來設定對於EMPLOYEES表中行之內的department字段(實際上這個函數並不返回一個靜態表它可以確定當前用戶是誰並據此返回給該用戶正確的部門值)
BEGIN
DBMS_RLSADD_POLICY(object_schema=>HR
object_name=>EMPLOYEES
policy_name=>restrict_dept_policy
function_schema=>HR
policy_function=>rls_dept
sec_relevant_cols=>salarycommission_pct
sec_relevant_cols_opt=>dbms_rlsALL_ROWS);
END;
/
列表B
列表B顯示了如何應用列表A中的函數創建列值掩碼在DBMS_RLS包中的過程ADD_POLICY創建一個稱為restrict_dept_policy的新策略參數sec_relevant_cols表明字段salary和commission_pct是安全相關列一個包含上述兩個字段的查詢將會應用到該策略函數不包含的查詢就不會應用該策略最後參數sec_relevant_cols_opts設定為常量ALL_ROWS
列值掩碼應用於SELECT語句無論哪個客戶訪問數據庫都可以實施列值掩碼諸如SQL *PlusNET應用或者其它工具
From:http://tw.wingwit.com/Article/program/Oracle/201311/18170.html