VPD(細粒度存取控制)對 DML 提供列級安全檢查。策略函數關聯資料表,依用戶上下文動態添加 WHERE 條件。例如:
-- 用戶查詢
SELECT * FROM employees;
-- 實際執行
SELECT * FROM employees WHERE department_id = 60;
僅回傳授權範圍內的行。
新選項允許回傳「所有行」,但未授權行的敏感欄位(安全相關欄位)顯示 NULL,其他欄位正常顯示。需在 VPD 策略中做兩件事:
ALL_ROWS 選項以回傳所有行策略函數(列表 A):
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;
套用策略(列表 B):
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;
參數說明:sec_relevant_cols 指定薪資與傭金為敏感欄位;sec_relevant_cols_opt => ALL_ROWS 啟用列值遮罩。包含這兩欄的查詢才套用策略,否則不受限。適用於 SQL*Plus、.NET 等所有客戶端。