如何查找调用Oracle PL/SQL存储过程monitoring_5_min的触发源?
查找调用Oracle存储过程
monitoring_5_min的对象 以下是几种Oracle系统层面的方法,帮你追踪调用该存储过程的对象:
1. 检查Oracle内置调度任务
如果是Oracle自带的DBMS_SCHEDULER调度任务触发调用,可通过以下视图查询:
- 直接查找调用该过程的调度作业:
SELECT job_name, program_name, schedule_name, enabled, last_start_date, next_run_date FROM dba_scheduler_job_details WHERE job_action LIKE '%monitoring_5_min%' OR (program_name IS NOT NULL AND EXISTS ( SELECT 1 FROM dba_scheduler_programs WHERE program_name = dba_scheduler_job_details.program_name AND program_action LIKE '%monitoring_5_min%' ));
- 查看定义中包含该过程的调度程序:
SELECT program_name, program_action, number_of_arguments FROM dba_scheduler_programs WHERE program_action LIKE '%monitoring_5_min%';
2. 分析PL/SQL对象依赖关系
如果调用来自其他数据库对象(比如存储过程、函数、触发器),可以通过依赖视图直接定位:
SELECT owner, name, type FROM dba_dependencies WHERE referenced_name = 'MONITORING_5_MIN' AND referenced_type = 'PROCEDURE' AND owner NOT IN ('SYS', 'SYSTEM'); -- 可根据需要调整过滤条件
这个视图会列出所有直接依赖该存储过程的数据库对象。
3. 检索近期PL/SQL调用记录
v$sql并非只记录纯SQL,包含该过程调用的PL/SQL块也会被存储,你可以用以下查询过滤:
SELECT sql_text, last_active_time, parsing_schema_name FROM v$sql WHERE UPPER(sql_text) LIKE '%MONITORING_5_MIN%' AND sql_text NOT LIKE '%v$sql%'; -- 排除当前查询本身
若需要聚合的调用统计,可使用v$sqlarea:
SELECT sql_text, executions, last_active_time FROM v$sqlarea WHERE UPPER(sql_text) LIKE '%MONITORING_5_MIN%';
4. 临时启用审计追踪(需权限)
如果上述方法未找到线索,可以临时启用审计来捕获所有执行该过程的操作:
- 开启审计:
AUDIT EXECUTE ON monitoring_5_min BY ACCESS;
- 查询审计记录:
SELECT username, timestamp, action_name, obj_name FROM dba_audit_trail WHERE obj_name = 'MONITORING_5_MIN' AND action_name = 'EXECUTE';
- 完成追踪后关闭审计,避免不必要的性能开销:
NOAUDIT EXECUTE ON monitoring_5_min;
权限与补充说明
- 以上查询大多需要DBA级权限,若没有,可将
DBA_前缀替换为ALL_(如all_scheduler_job_details),但只能看到你有权限访问的对象。 - 若调用来自外部Web服务,数据库层面只能记录到会话的基本信息(如
v$session中的program、machine字段),无法直接关联到具体服务,除非服务调用时设置了特定标识(如client_info)。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

