统一审计未启用时AUDIT POLICY无效,必须执行make -f ins_rdbms.mk uniaud_on ioracle重链接并重启数据库;V$OPTION返回TRUE仅表示支持,需通过SELECT * FROM UNIFIED_AUDIT_TRAIL验证视图是否存在且可查,且audit_trail参数必须为NONE。
统一审计没启用,AUDIT POLICY 就是摆设
oracle 19c 默认不启用纯统一审计,哪怕你看到 v$option 返回 true,也只是表示“支持”,不代表已激活。真正启用必须走二进制重链接 + 重启,跳过这步,后续所有策略都不会记录任何事件。
检查真实状态的唯一可靠方式是:
- 运行
SELECT value FROM V$OPTION WHERE PARAMETER = 'Unified Auditing'—— 若为FALSE,必须重链接 - 若为
TRUE,再执行SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE ROWNUM = 1 - 如果报
ORA-00942: table or view does not exist,说明没启用;返回空但无报错,再查SHOW PARAMETER audit_trail,值必须是NONE
启用步骤(Linux):
- 停库:
SHUTDOWN IMMEDIATE;停监听:lsnrctl stop - 切换到
$ORACLE_HOME/rdbms/lib,执行:make -f ins_rdbms.mk uniaud_on ioracle - 重启:
STARTUP
AUDIT DROP ANY TABLE 在统一审计里根本不能用
传统审计下的 AUDIT DROP ANY TABLE 命令在统一审计模式下完全无效。它只对标准审计(audit_trail=DB)起作用,且依赖 audit_trail 和 audit_sys_operations 两个静态参数重启生效——这些在统一审计中已被废弃。
统一审计监控删表行为,必须用策略(AUDIT POLICY)+ 显式启用:
- 创建策略:
CREATE AUDIT POLICY drop_table_policy ACTIONS DROP ANY TABLE - 启用策略(关键!不执行这步等于没配):
AUDIT POLICY drop_table_policy BY ALL USERS(全库)或AUDIT POLICY drop_table_policy BY SYSTEM, DBA(仅指定用户) - 注意:
ACTIONS DROP ANY TABLE审计的是拥有该系统权限的用户删他人 schema 的表,不是删自己表——删自己表需用ACTIONS DROP ON schema.table
查不到记录?先确认三件事
策略启用后仍无审计日志,大概率卡在这三个环节:
- 目标用户是否真有
DROP ANY TABLE权限?查:SELECT * FROM dba_sys_privs WHERE privilege = 'DROP ANY TABLE' AND grantee = 'USERNAME' - 删表操作是否真的触发了该权限?例如
DROP TABLE hr.employees是,DROP TABLE t1(自己 schema)不是 - 执行删表的会话是否属于策略启用范围?比如策略写了
BY SYSTEM,但你是用SCOTT登录执行的,就不会被记录
另外,统一审计日志默认存在 UNIFIED_AUDIT_TRAIL 视图,查询时必须用有 READ ANY AUDIT RECORD 权限的用户(SYS 不行,会报 ORA-46367),推荐用授予该权限的专用审计账号。
清理日志前,INIT_CLEANUP 必须先跑
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL 调用成功但没删数据,几乎一定是没初始化。统一审计清理必须严格按顺序操作:
- 首次启用前,必须运行:
BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, default_cleanup_interval => 24); END; - 然后设置归档时间戳:
BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, last_archive_time => SYSTIMESTAMP - 7); END; - 最后调用清理:
BEGIN DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => TRUE); END;
漏掉 INIT_CLEANUP 或传错 audit_trail_type(比如误用 AUDIT_TRAIL_AUD_STD),函数会静默失败——不报错、不清理、也不提示。











