Fine-Grained Auditing (FGA) 可針對特定資料表、特定欄位、特定條件 (如僅稽核薪資欄位變更超過 20% 的 UPDATE) 記錄存取行為,解決傳統稽核「全表、全操作」過於粗糙、產生海量無效日誌的問題。本文以 SCOTT.EMP 為例,示範政策建立、啟用、查詢、刪除全流程。
| 程序 | 功能 |
ADD_POLICY | 建立稽核政策 |
ENABLE_POLICY | 啟用政策 |
DISABLE_POLICY | 停用政策 |
DROP_POLICY | 刪除政策 |
二、完整實作腳本
1. 新增政策:稽核 EMP 表的 INSERT/UPDATE/DELETE,任意欄位觸發
BEGIN
DBMS_FGA.ADD_POLICY (
object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'mypolicy1',
handler_schema => NULL, -- 可指定事件處理程序 (PL/SQL 程序)
handler_module => NULL,
enable => TRUE,
statement_types => 'INSERT, UPDATE, DELETE',
audit_column_opts => DBMS_FGA.ANY_COLUMNS -- 任一欄位被存取即觸發
);
END;
/
關鍵參數說明:
audit_column_opts:ANY_COLUMNS (任一欄位) / ALL_COLUMNS (所有指定欄位皆被存取) — 10g+ 支援。
audit_column:可指定特定欄位清單 (如 'SAL, COMM'),配合 audit_column_opts 實現欄位級稽核。
handler_module:可指定 'pkg_audit_handler.proc_log',在稽核觸發時執行自訂邏輯 (如發送告警、寫入自訂表)。
2. 啟用/停用政策
-- 啟用 (ADD_POLICY 已指定 enable=>TRUE 可省略)
BEGIN
DBMS_FGA.ENABLE_POLICY (
object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'mypolicy1',
enable => TRUE
);
END;
/
-- 停用
BEGIN
DBMS_FGA.DISABLE_POLICY (..., enable => FALSE);
END;
/
3. 查詢稽核記錄
-- 核心稽核視圖
SELECT db_user, timestamp, sql_text, sql_bind
FROM dba_fga_audit_trail;
-- 查看視圖定義
SELECT text FROM dba_views WHERE view_name = 'DBA_FGA_AUDIT_TRAIL';
-- 所有政策狀態
SELECT * FROM dba_audit_policies;
4. 刪除政策
BEGIN
DBMS_FGA.DROP_POLICY (
object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'mypolicy1'
);
END;
/
三、進階應用場景
| 需求 | 實作方式 |
| 僅稽核 SAL 欄位變更 | audit_column => 'SAL', audit_column_opts => DBMS_FGA.ANY_COLUMNS |
| 稽核特定條件 (如 SAL > 5000) | audit_condition => 'SAL > 5000' (10g+ 支援) |
| 稽核特定使用者 | 在 handler_module 中判斷 SYS_CONTEXT('USERENV','SESSION_USER') |
| 稽核 SELECT (查詢敏感資料) | statement_types => 'SELECT' (11g+ 支援) |
四、效能與管理注意事項
- FGA 記錄寫入
SYS.FGA_LOG$ (底層表),定期清理或分區避免 SYSAUX 表空間暴增。
- 政策過多會增加解析開銷,僅對敏感表/欄位啟用。
- 配合
DBMS_FGA.ADD_POLICY 的 handler_module 可實現即時告警、資料遮罩等進階邏輯。
- 12c+ 建議改用 Unified Auditing (整合標準稽核、FGA、Fine-Grained Auditing、RMAN/DP/Label Security 等),效能更優、管理更簡潔。
- 上一篇文章: Oracle 外鍵約束詳解:子表、父表關係與刪除規則
- 下一篇文章: Oracle ROWNUM 偽欄位深度解析:分頁查詢、排序陷阱與效能優化
Copyright ©
程式碼之家 All Rights Reserved