You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从数据库中查询仅包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:15:04