必须用统一审计,因FGA无用户级DML过滤机制,statement_types虽支持INSERT/UPDATE/DELETE,但策略对所有会话生效,无法限定“仅SCOTT用户”,且19c中DML审计仍受限;统一审计通过AUDIT POLICY...BY username精准控制作用域,启用后日志仅写入UNIFIED_AUDIT_TRAIL。

必须用统一审计(Unified Auditing),FGA 不支持按用户粒度过滤 DML,且默认不审计 DML(除非显式指定)。
为什么不能直接用 DBMS_FGA.ADD_POLICY
FGA 的 statement_types 虽然能写 'INSERT,UPDATE,DELETE',但它没有 BY user 机制——策略一旦启用,所有满足条件的会话都会触发,无法限定“只审计 SCOTT 用户的 UPDATE”。
更关键的是:Oracle 19c 默认未启用 FGA 对 DML 的支持(需确认版本 ≥10g,但 19c 中它仍受限于策略范围,而非执行者身份)。
常见错误是创建了 FGA 策略、看到 SELECT 被记录,就以为 DML 也生效了,结果查 DBA_FGA_AUDIT_TRAIL 为空。
统一审计中如何精准锁定特定用户
统一审计通过 AUDIT POLICY ... BY username 实现用户级控制,这是唯一可靠方式:
• 创建策略时只定义动作类型,不绑定用户
• 启用策略时才指定作用域,例如只对 SCOTT 和 HR 生效
• 支持组合:既可限定用户,也可加条件(如仅当操作涉及敏感表)
最小可行示例:
CREATE AUDIT POLICY scott_dml_policy
ACTIONS INSERT, UPDATE, DELETE ON hr.employees,
INSERT, UPDATE, DELETE ON hr.departments;
<p>AUDIT POLICY scott_dml_policy BY SCOTT, HR;注意:
• AUDIT POLICY 必须显式执行,仅 CREATE 不会记录任何事件
• BY SCOTT, HR 是启用指令,不是创建时的参数
• 若想审计“所有拥有 DROP ANY TABLE 权限的用户”,不能写 BY ALL USERS,而要写 AUDIT POLICY drop_policy BY ALL USERS WHENEVER PRIVILEGE USED
查不到记录?先验证这三件事
统一审计日志缺失,90% 源于前置条件未满足:
• SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE ROWNUM = 1 报 ORA-00942 → 统一审计根本没启用(跳过了 make -f ins_rdbms.mk uniaud_on ioracle + 重启)
• SHOW PARAMETER audit_trail 返回 DB 或 XML → 仍在混合模式,必须设为 NONE
• 执行 DML 的会话用户名 ≠ 策略中 BY 列出的用户(例如策略写 BY SCOTT,但你用 SYSTEM 登录执行了 UPDATE hr.employees)
audit_trail = NONE 不等于“没日志”,而是日志只进 UNIFIED_AUDIT_TRAIL
启用统一审计后,传统视图 DBA_AUDIT_TRAIL、DBA_FGA_AUDIT_TRAIL 就不再接收新记录——所有审计事件只写入 UNIFIED_AUDIT_TRAIL。
别再用 SELECT * FROM DBA_FGA_AUDIT_TRAIL WHERE DB_USER = 'SCOTT' 查,它永远为空。
正确查询方式:
SELECT dbusername, client_ip, unified_audit_policies,
action_name, object_schema, object_name,
extended_timestamp, sql_text
FROM UNIFIED_AUDIT_TRAIL
WHERE unified_audit_policies = 'SCOTT_DML_POLICY'
AND extended_timestamp > SYSDATE - 1/24;容易被忽略的点:
• unified_audit_policies 字段值是大写的策略名,区分大小写
• sql_text 在默认配置下可能被截断(最多 200 字符),若需完整 SQL,建策时加 WHENEVER SUCCESSFUL 或确保数据库参数 unified_audit_simplified_mode=FALSE
• 客户端 IP 地址来自 client_ip,不是 os_user 或 terminal,后者在连接池场景下不可靠


















