Oracle统一审计追踪中如何跟踪关联模块/SQL的审计日志?
Oracle统一审计追踪关联脚本/版本信息的替代方案
你之前用DBMS_APPLICATION_INFO.SET_MODULE标记脚本版本的思路没问题,但统一审计日志确实不包含Module和Action字段,下面是几个实用的替代方法,不用跨多个视图就能直接筛选关联审计日志:
1. 用客户端标识符(Client Identifier)标记
这是最直接的方案,设置后统一审计日志会直接记录该标识:
- 脚本开头执行:
可以把版本和脚本名合并成一个字符串,或者用分隔符区分,比如EXEC DBMS_SESSION.SET_IDENTIFIER('RELEASE123_My_Script.sql');RELEASE123|My_Script.sql - 筛选审计日志时,直接查询
UNIFIED_AUDIT_TRAIL的CLIENT_IDENTIFIER列:SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE CLIENT_IDENTIFIER = 'RELEASE123_My_Script.sql';
2. 自定义审计上下文(Audit Context)
如果需要同时标记多个维度的信息(比如版本、脚本名、执行人),可以用这个方法添加自定义键值对:
- 脚本开头执行:
BEGIN DBMS_AUDIT_MGMT.SET_AUDIT_CONTEXT( NAMES => SYS.DBMS_AUDIT_MGMT.NAME_LIST('RELEASE_VERSION', 'SCRIPT_NAME'), VALUES => SYS.DBMS_AUDIT_MGMT.VALUE_LIST('RELEASE123', 'My_Script.sql') ); END; / - 这些信息会存在
UNIFIED_AUDIT_TRAIL的ADDITIONAL_INFO列(JSON格式),用JSON函数筛选:SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE JSON_VALUE(ADDITIONAL_INFO, '$.RELEASE_VERSION') = 'RELEASE123' AND JSON_VALUE(ADDITIONAL_INFO, '$.SCRIPT_NAME') = 'My_Script.sql';
3. 利用会话程序名(Program)字段
如果你习惯用DBMS_APPLICATION_INFO的方式,可以改用SET_PROGRAM,这个字段会被统一审计日志捕获:
- 脚本开头执行:
EXEC DBMS_APPLICATION_INFO.SET_PROGRAM('RELEASE123_My_Script.sql'); - 筛选时查询
UNIFIED_AUDIT_TRAIL的PROGRAM列:SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE PROGRAM = 'RELEASE123_My_Script.sql';
这三个方案都不需要关联额外视图,直接在UNIFIED_AUDIT_TRAIL里就能完成筛选,根据你的实际需求选就行——单标识用客户端标识符,多维度信息用自定义审计上下文,想兼容原有习惯就用程序名字段。
内容的提问来源于stack exchange,提问作者nightmare637
相关产品推荐
相关产品推荐

