結合 虛擬私有資料庫(VPD,細粒度存取控制 FGAC) 與 DBMS_RLS.ADD_POLICY 的 SEC_RELEVANT_COLS_OPT => DBMS_RLS.ALL_ROWS 參數,達成「返回所有行,但敏感欄位顯示 NULL」的效果。
-- 1. 策略函數:限定部門 60
CREATE OR REPLACE FUNCTION rls_dept (
obj_owner IN VARCHAR2, obj_name IN VARCHAR2
) RETURN VARCHAR2 AS
BEGIN
RETURN 'department_id = 60';
END;
/
-- 2. 套用策略:salary、commission_pct 為敏感欄位,啟用 ALL_ROWS
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,其他欄位正常顯示。適用於 SQL*Plus、.NET 應用、BI 工具等所有存取路徑。