如何查询数据库中所有活跃的存储过程?确认未遗漏已删除项
好问题!你刚删除了大量存储过程,想确认有没有遗漏,找出活跃的存储过程(也就是正在被使用或近期被调用的)确实是个靠谱的思路。不同数据库系统的查询方法不太一样,我给你分主流情况说明:
针对不同数据库的查询方法
1. SQL Server
SQL Server提供了系统视图可以跟踪正在执行的存储过程,也能查看近期的调用统计:
- 查询当前正在运行的存储过程
通过关联执行请求和SQL文本视图,精准定位正在执行的存储过程:
SELECT session_id, DB_NAME(database_id) AS DatabaseName, OBJECT_NAME(objectid, database_id) AS ActiveStoredProc, start_time, status FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_sql_text(sql_handle) WHERE OBJECT_NAME(objectid, database_id) IS NOT NULL AND OBJECTPROPERTY(objectid, 'IsProcedure') = 1;
- 查询近期被调用过的存储过程
这个需要SQL Server开启了统计信息(默认是开启的),能看到存储过程的执行次数和最后运行时间:
SELECT OBJECT_NAME(object_id) AS StoredProcName, execution_count AS ExecutionCount, last_execution_time AS LastRunTime FROM sys.dm_exec_procedure_stats WHERE database_id = DB_ID(); -- 替换成你要查询的数据库ID,或者保留DB_ID()查当前库
2. MySQL
MySQL可以通过进程列表和性能模式来追踪存储过程的使用情况:
- 查询当前正在执行的存储过程
过滤进程列表中调用存储过程的语句:
SELECT ID, USER, DB, COMMAND, TIME, INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query' AND INFO LIKE '%CALL %'; -- 匹配调用存储过程的语句
- 查看存储过程的调用统计
需要先开启performance_schema,之后就能看到执行次数和最后运行时间:
SELECT OBJECT_NAME AS StoredProcName, COUNT_STAR AS ExecutionCount, LAST_TIMESTAMP AS LastRunTime FROM performance_schema.events_statements_summary_by_object WHERE OBJECT_TYPE = 'PROCEDURE' AND SCHEMA_NAME = 'your_database_name'; -- 替换成你的目标数据库名
3. PostgreSQL
PostgreSQL可以通过系统视图查询当前运行的进程,以及存储过程的执行统计:
- 查询当前正在运行的存储过程
过滤出调用存储过程或函数的活跃会话:
SELECT pid, datname AS DatabaseName, usename, query_start, query FROM pg_stat_activity WHERE query LIKE '%CALL %' OR query LIKE '%SELECT %()%'; -- 匹配存储过程/函数调用语句
- 查看近期执行的存储过程统计
通过用户存储过程的统计视图,了解调用情况:
SELECT proname AS StoredProcName, calls AS ExecutionCount, last_call AS LastRunTime FROM pg_stat_user_procedures WHERE schemaname = 'public'; -- 替换成你的目标模式名
额外建议
- 这些查询大多需要相应的权限,比如SQL Server需要
VIEW SERVER STATE权限,MySQL需要SELECT ON performance_schema权限,如果报错可以联系DBA申请权限。 - 除了查询活跃存储过程,还建议检查你的应用代码、定时任务(比如SQL Server Agent Jobs、MySQL Events)里有没有引用已删除的存储过程,避免遗漏。
- 对于长期未被调用的存储过程,结合统计信息可以判断是否已经废弃,进一步确认删除的完整性。
内容的提问来源于stack exchange,提问作者overwhelmedaf




