Oracle 19c中无法直接查询存储过程的历史执行者,除非提前启用审计;DBA_AUDIT_TRAIL或UNIFIED_AUDIT_TRAIL是唯一可靠来源,权限视图仅反映授权而非实际执行,临时排查手段有限且不可靠。
oracle 19c 中无法直接查到“某个存储过程被哪些用户执行过”的完整历史记录,除非你提前开启了审计或设置了会话跟踪。 数据库默认不持久化记录谁在什么时候调用了哪个存储过程——v$sysstat 只统计总次数,v$sql_workarea 只反映当前正在执行的上下文,都不是执行日志。
为什么 DBA_AUDIT_TRAIL 是唯一可靠入口
只有开启标准审计(AUDIT EXECUTE ON procedure_name)或统一审计(UNIFIED AUDIT POLICY)后,每次 EXEC 或 CALL 才会被写入审计视图。没开审计,就真没这数据。
- 启用后,执行记录会进入
DBA_AUDIT_TRAIL(传统审计)或UNIFIED_AUDIT_TRAIL(12c+ 推荐) - 关键字段包括:
USERNAME(执行者)、OBJ_NAME(过程名)、TIMESTAMP、ACTION_NAME = 'EXECUTE' - 注意:审计会产生 I/O 和存储开销,生产环境需权衡粒度,比如只审高危过程
USER_TAB_PRIVS 和 DBA_TAB_PRIVS 查的是权限,不是执行行为
这两个视图告诉你“谁被授权执行”,不是“谁实际执行过”。例如:
-
SELECT GRANTEE FROM DBA_TAB_PRIVS WHERE TABLE_NAME = 'MY_PROC' AND PRIVILEGE = 'EXECUTE'→ 返回有权限的用户列表 - 但
BISAL在权限列表里,不代表他昨天调用过;STAR不在列表里,也不代表他绝对没调过(比如通过DEFINER'S RIGHTS包间接调用) - 权限视图不包含时间戳、IP、客户端信息等执行上下文
临时补救:从当前会话和 SQL 历史中捞线索
如果没开审计,又急需定位近期调用者,可尝试以下组合排查(结果有限且易遗漏):
- 查当前正在执行该过程的会话:
SELECT sid, serial#, username, program FROM v$session WHERE sql_id IN (SELECT sql_id FROM v$sql WHERE upper(sql_text) LIKE '%MY_PROC%') - 查最近解析过该过程名的 SQL:
SELECT parsing_schema_name, sql_text FROM v$sql WHERE upper(sql_text) LIKE '%MY_PROC%' AND last_active_time > SYSDATE - 1/24(1 小时内) - 查依赖该过程的对象(反向推可能调用者):
SELECT owner, name, type FROM all_dependencies WHERE referenced_name = 'MY_PROC' AND referenced_owner = 'OWNER_NAME' - 注意:
v$sql中的sql_text可能被截断、大小写不一致、含换行或绑定变量,LIKE匹配不可靠
真正要回溯执行者,必须依赖审计配置;其他方法都是拼凑线索,不是事实记录。上线前就该决定是否审计关键过程,事后补救成本远高于事前规划。











