从数据库中查询仅包含SELECT语句的存储过程名称
查找仅含SELECT语句的存储过程方案
核心逻辑为读取存储过程的定义文本,筛选出仅包含读操作、不含任何写操作关键字的存储过程名称,不同数据库的实现语句如下:
SQL Server 实现
SELECT DISTINCT p.name AS 存储过程名称 FROM sys.procedures p INNER JOIN sys.sql_modules m ON p.object_id = m.object_id WHERE -- 包含SELECT关键字 m.definition LIKE '%SELECT%' -- 排除所有写操作关键字 AND m.definition NOT LIKE '%INSERT%' AND m.definition NOT LIKE '%UPDATE%' AND m.definition NOT LIKE '%DELETE%' AND m.definition NOT LIKE '%MERGE%' AND m.definition NOT LIKE '%INTO%' -- 排除SELECT ... INTO 写表操作
MySQL 实现
SELECT ROUTINE_NAME AS 存储过程名称 FROM information_schema.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_DEFINITION LIKE '%SELECT%' AND ROUTINE_DEFINITION NOT LIKE '%INSERT%' AND ROUTINE_DEFINITION NOT LIKE '%UPDATE%' AND ROUTINE_DEFINITION NOT LIKE '%DELETE%' AND ROUTINE_DEFINITION NOT LIKE '%SELECT%INTO%'
PostgreSQL 实现
SELECT proname AS 存储过程名称 FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid WHERE prokind = 'p' -- 筛选存储过程,排除函数 AND prosrc LIKE '%SELECT%' AND prosrc NOT LIKE '%INSERT%' AND prosrc NOT LIKE '%UPDATE%' AND prosrc NOT LIKE '%DELETE%' AND prosrc NOT LIKE '%SELECT INTO%'
注意事项
- 以上方案为文本匹配实现,若存储过程的注释、字符串常量中包含写操作关键字会出现误判,需要更高精度的结果可调用对应数据库的语法解析能力做结构化分析。
- 执行查询需要持有系统元数据表的访问权限,否则仅能返回当前用户有权限查看的存储过程。
- 若存储过程内部调用了其他包含写操作的存储过程或函数,文本匹配无法识别,需要额外递归分析存储过程调用链才能排除。
内容的提问来源于stack exchange,提问作者nileshmonde
相关产品推荐
相关产品推荐

