Oracle 虛擬私有資料庫(VPD,Fine-Grained Access Control)可在 SELECT 等 DML 語句上施加行級安全策略。10g 新增 SEC_RELEVANT_COLS_OPT => DBMS_RLS.ALL_ROWS 選項,實現「返回所有行,但敏感欄位顯示 NULL」的列值遮罩。
CREATE OR REPLACE FUNCTION rls_dept (
obj_owner IN VARCHAR2,
obj_name IN VARCHAR2
) RETURN VARCHAR2 AS
predicate VARCHAR2(200);
BEGIN
predicate := 'department_id = 60';
RETURN predicate;
END rls_dept;
/
BEGIN
DBMS_RLS.ADD_POLICY(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'restrict_dept_policy',
function_schema => 'HR',
policy_function => 'rls_dept',
sec_relevant_cols => 'salary,commission_pct', -- 敏感欄位
sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS -- 關鍵:返回所有行
);
END;
/
salary 或 commission_pct 時,策略生效:滿足 department_id = 60 的行正常顯示薪資,其餘行這兩欄顯示 NULL。無需修改應用程式碼、視圖或建立獨立遮罩表;策略集中在資料庫層維護,安全性與維護性俱佳。