透過策略函數動態為查詢附加謂詞,將 SELECT * FROM accounts; 重寫為 SELECT * FROM accounts WHERE am_name = 'SCOTT';,實現行級安全。
| 類型 | 特徵 | 適用場景 |
|---|---|---|
| DYNAMIC(預設) | 每次存取、每行重新執行函數 | 謂詞高度動態、依賴即時 Session 狀態 |
| CONTEXT_SENSITIVE | 應用程式上下文未變則不重新執行 | 謂詞含 SYS_CONTEXT,上下文相對穩定 |
| SHARED_CONTEXT_SENSITIVE | 跨 Session 共享相同上下文結果 | Web 應用連線池,多用戶共用 DB User |
| STATIC | 謂詞完全固定,僅編譯一次 | 謂詞僅依賴固定 USER_ID、角色 |
| SHARED_STATIC | 跨 Session 共享靜態謂詞 | 大量 Session 共用相同靜態策略 |
-- 策略函數
CREATE OR REPLACE FUNCTION rls_dept (...) RETURN VARCHAR2 AS
BEGIN RETURN 'department_id = 60'; END;
-- 套用策略: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,其餘欄位正常。