傳統 VPD (Fine-Grained Access Control) 透過 Policy Function 動態附加 WHERE 條件,**過濾掉無權限行**。10g 新增 **Column Masking(列值遮罩)**:返回所有行,但敏感欄位顯示 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;
/
-- 實際應用中可根據 SYS_CONTEXT('USERENV','SESSION_USER') 動態決定部門
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;
/
SELECT * FROM employees 可見**所有部門員工行**。salary 或 commission_pct,**非授權部門行這兩欄顯示 NULL**;授權部門行顯示真實值。| 參數 | 作用 |
|---|---|
SEC_RELEVANT_COLS | 指定哪些欄位為「安全相關列」,只有查詢這些欄位時才套用遮罩邏輯。 |
SEC_RELEVANT_COLS_OPT = DBMS_RLS.ALL_ROWS | 開啟「返回所有行」模式,而非傳統過濾行。 |
DBMS_REDACT(Data Redaction)提供更豐富遮罩格式(部分遮罩、隨機值、正則替換)。