Oracle中v$session会话结束后内容是否有留存的表?
Oracle代理用户会话审计的解决方案
Oracle没有直接满足你需求的内置表,需要结合现有审计工具或自行构建存储方案来长期记录代理用户会话及对应的client_identifier。以下是两种可行方案:
方案一:自定义表+登录触发器
这是最直接的方式,通过登录后触发器捕获v$session中的关键信息,存入自定义表长期留存,同时关联审计日志中的代理会话ID。
- 创建自定义审计表
CREATE TABLE proxy_session_audit ( session_id NUMBER, client_identifier VARCHAR2(64), proxy_user VARCHAR2(30), authenticated_user VARCHAR2(30), login_time TIMESTAMP, os_user VARCHAR2(30), machine VARCHAR2(64), program VARCHAR2(48) );
- 创建登录后触发器
CREATE OR REPLACE TRIGGER log_proxy_session AFTER LOGON ON DATABASE DECLARE v_client_id VARCHAR2(64); v_proxy_user VARCHAR2(30); BEGIN SELECT client_identifier, proxy_user INTO v_client_id, v_proxy_user FROM v$session WHERE audsid = SYS_CONTEXT('USERENV', 'SESSIONID'); INSERT INTO proxy_session_audit ( session_id, client_identifier, proxy_user, authenticated_user, login_time, os_user, machine, program ) VALUES ( SYS_CONTEXT('USERENV', 'SESSIONID'), v_client_id, v_proxy_user, SYS_CONTEXT('USERENV', 'AUTHENTICATED_IDENTITY'), SYSTIMESTAMP, SYS_CONTEXT('USERENV', 'OS_USER'), SYS_CONTEXT('USERENV', 'HOST'), SYS_CONTEXT('USERENV', 'MODULE') ); EXCEPTION WHEN NO_DATA_FOUND THEN -- 处理非代理会话或无client_identifier的情况 NULL; END; /
- 关联
DBA_AUDIT_TRAIL
后续审计时,可以通过session_id(对应DBA_AUDIT_TRAIL中的SESSIONID字段)将自定义表的client_identifier与审计日志中的代理操作关联起来。
方案二:使用统一审计(Unified Auditing)
Oracle 12c及以上版本的统一审计可以更灵活地捕获会话信息,包括client_identifier和代理用户详情,无需额外触发器。
- 启用统一审计(若未启用)
ALTER SYSTEM SET audit_trail=db,extended SCOPE=SPFILE; -- 重启数据库生效
- 创建审计策略
CREATE AUDIT POLICY proxy_session_policy ACTIONS LOGON WHEN 'PROXY_USER IS NOT NULL' EVALUATE PER SESSION;
- 启用审计策略
AUDIT POLICY proxy_session_policy;
- 查询审计数据
通过UNIFIED_AUDIT_TRAIL视图可以直接获取包含client_identifier、代理用户、会话ID等完整信息的审计记录:
SELECT sessionid, client_identifier, proxy_user, authentication_type, event_timestamp FROM unified_audit_trail WHERE audit_type = 'LOGON' AND proxy_user IS NOT NULL;
统一审计的优势在于无需维护自定义触发器和表,Oracle会自动长期留存审计数据(可通过审计保留策略配置留存时间)。
补充说明
DBA_AUDIT_SESSION视图包含登录会话的基础信息,但同样没有client_identifier,仍需结合自定义表或统一审计来补充。- 若使用传统审计(非统一审计),
DBA_AUDIT_TRAIL中的SESSIONID可与自定义表的session_id关联,实现代理用户与client_identifier的映射。
内容的提问来源于stack exchange,提问作者SeanGaff
相关产品推荐
相关产品推荐

