Oracle 11g执行审计操作后无结果,请求排查原因
我来帮你梳理下为什么用store用户操作后查不到审计记录,大概率是这几个环节没做好:
1. 核心审计参数未启用
Oracle 11g默认是关闭审计功能的,你得先确认audit_trail这个初始化参数的状态。如果它的值是NONE,那不管你执行多少审计命令,都不会生成任何审计记录。
你可以用这条语句查询参数状态:
SHOW PARAMETER audit_trail;
如果结果是NONE,就需要修改参数(注意这个参数需要重启数据库才能生效):
ALTER SYSTEM SET audit_trail=DB SCOPE=SPFILE; -- 执行完后重启数据库
DB表示把审计记录存在数据库的SYS.AUD$表中(也就是db_audit_trail视图对应的底层表);如果想记录更多操作细节,可以设为DB_EXTENDED。
2. 审计语句的权限范围不对
你执行的AUDIT CREATE ANY TABLE BY store;,其实审计的是store用户使用CREATE ANY TABLE权限的操作——但这个权限是用来创建其他用户名下的表的。而你自己执行CREATE TABLE test_mj_aud(...)时,用的是CREATE TABLE权限(属于用户自身的表空间操作权限),不在这条审计语句的覆盖范围内。
如果要审计store用户自己创建表的操作,应该改成:
AUDIT CREATE TABLE BY store;
3. 审计记录的存储位置不匹配
如果audit_trail参数设为OS,审计记录会存在操作系统的日志文件里(比如Linux下的/var/log/oracle/audit/目录),这时候db_audit_trail和user_audit_trail视图里是查不到内容的,你得去操作系统对应的日志目录里找。
4. 审计视图的访问权限不足
虽然你给了store用户AUDIT SYSTEM和AUDIT ANY权限,但db_audit_trail视图基于SYS.AUD$表,有时候需要显式授权才能查看:
-- 直接授权访问审计表 GRANT SELECT ON SYS.AUD$ TO store; -- 或者授予目录查询角色,更方便 GRANT SELECT_CATALOG_ROLE TO store;
验证步骤
修改完参数和审计语句后,重新执行操作测试:
-- 先取消之前的审计规则(可选) NOAUDIT CREATE ANY TABLE BY store; -- 配置正确的审计规则 AUDIT CREATE TABLE BY store; -- 重新创建表 CREATE TABLE test_mj_aud_new( id INTEGER); -- 查询审计记录 SELECT * FROM user_audit_trail; SELECT * FROM db_audit_trail;
这样应该就能看到对应的审计记录了。
内容的提问来源于stack exchange,提问作者Jawor

