oracle细粒度审计(fga)仅在策略匹配时触发,默认只审计select(9i),10g+才支持dml;需确认版本与权限,严格区分大小写,audit_condition为布尔表达式,statement_types须全大写,启用db_extended才能获取完整sql和绑定变量。
oracle 的细粒度审计(fga)不依赖 audit_trail 参数重启,也不记录所有操作——它只在策略匹配时触发,且默认只审计 select(oracle 9i),10g+ 才支持 insert/update/delete。直接上手前先确认版本和权限,否则执行 dbms_fga.add_policy 会报 ora-47101: insufficient privileges。
DBMS_FGA.ADD_POLICY 参数怎么填才生效
常见错误是把 audit_condition 写成 SQL WHERE 子句但漏掉字段可见性检查,或误用 statement_types 大小写。Oracle 对该参数严格区分大小写,必须全大写、逗号后无空格。
-
object_schema和object_name必须真实存在,且当前执行用户(通常是SYS或有AUDIT_ADMIN角色的用户)对该对象有SELECT权限 -
policy_name在同一 schema 下必须唯一;重复创建会报ORA-47102: policy already exists -
audit_column若指定,如'SALARY,EMAIL',则仅当 SQL 引用这些列时才触发审计;设为NULL表示任意列访问都触发 -
audit_condition是布尔表达式,不是完整 WHERE,例如'DEPT_ID = 10'合法,'WHERE DEPT_ID = 10'会报错 -
statement_types必须是'SELECT'、'INSERT,UPDATE'等组合,不能写'select'或'Select'
审计记录查不到?先看 DBA_FGA_AUDIT_TRAIL 是否有数据
FGA 日志默认写入数据字典表 FGA_LOG$(SYS 拥有),对外暴露视图 DBA_FGA_AUDIT_TRAIL。但该视图默认不包含 SQL_BIND 和完整 SQL_TEXT,除非启用 audit_trail => DBMS_FGA.DB_EXTENDED。
- 普通查询只能看到截断的
SQL_TEXT(最多 200 字符),绑定变量完全不可见 - 若需完整语句和绑定值,创建策略时必须显式指定
audit_trail => DBMS_FGA.DB_EXTENDED -
DBA_FGA_AUDIT_TRAIL中的TIMESTAMP是数据库时间,非客户端本地时间;EXTENDED_TIMESTAMP列精度更高,建议优先用它 - 刚执行 DML 后查不到记录?FGA 是同步触发,但日志写入有毫秒级延迟,等 1–2 秒再查
生成可读报告:别直接 SELECT * from DBA_FGA_AUDIT_TRAIL
原始视图字段多、命名不直观,且 SQL_TEXT 可能被截断。实际交付报告时应封装逻辑,避免每次手动拼接。
- 用
SELECT DB_USER, OS_USER, OBJECT_SCHEMA, OBJECT_NAME, POLICY_NAME, EXTENDED_TIMESTAMP, SQL_TEXT FROM DBA_FGA_AUDIT_TRAIL WHERE EXTENDED_TIMESTAMP > SYSDATE - 1快速拉取昨日记录 - 对敏感操作加过滤:
AND STATEMENT_TYPE IN ('SELECT','UPDATE'),注意STATEMENT_TYPE列名不是statement_types - 导出 CSV 时用
SET MARKUP HTML OFF+SPOOL,避免 SQL*Plus 自动换行破坏 SQL 语句格式 - 若需关联用户角色或部门信息,不要硬编码 JOIN,而是建物化视图或临时表预处理,因为
DBA_FGA_AUDIT_TRAIL是高并发写入表,JOIN 会拖慢查询
最易被忽略的是策略启用状态和审计条件求值时机:audit_condition 在 SQL 执行计划生成后、行返回前求值,如果用了函数索引或虚拟列,条件可能因优化器路径不同而失效;禁用策略要用 DBMS_FGA.DISABLE_POLICY,而不是删了重建——后者会清空对应历史记录。











