MySQL中查存储过程定义应使用SHOW CREATE PROCEDURE mydb.my_proc,需指定数据库名否则报PROCEDURE does not exist;返回结果中Create Procedure字段才是完整定义体,且至少需SELECT权限或更推荐的EXECUTE权限。

MySQL 中查存储过程定义用 SHOW CREATE PROCEDURE
直接拿到原始创建语句,最接近你写进去的样子。注意必须指定数据库名,否则会报错 ERROR 1305 (42000): PROCEDURE xxx does not exist。
执行前先选库或在语句里带上库名:
SHOW CREATE PROCEDURE mydb.my_proc;
常见坑点:
- 用户权限不足时会提示
Access denied,至少需要SELECT权限在mysql.proc表,或更推荐的EXECUTE权限 - 过程名区分大小写,取决于系统变量
lower_case_table_names设置,Linux 上默认敏感 - 返回结果里
Create Procedure字段才是定义体,别误读了character_set_client那几列
SQL Server 用 sys.sql_modules 关联查询
SQL Server 不提供单条命令直接导出,得自己拼表。核心是通过 object_id 把 sys.procedures 和 sys.sql_modules 连起来,后者存着 definition 文本。
典型写法:
SELECT m.definition FROM sys.procedures p JOIN sys.sql_modules m ON p.object_id = m.object_id WHERE p.name = 'my_proc';
要注意:
- 如果过程在 schema 下(比如
dbo.my_proc),WHERE条件得加AND p.schema_id = SCHEMA_ID('dbo') -
definition是nvarchar(max),SSMS 默认只显示前 4000 字符,右键结果 → “复制特殊” → “复制完整文本” 才能拿全 - 加密过的存储过程(
WITH ENCRYPTION)这里查出来是NULL,没别的办法绕过
PostgreSQL 查 pg_proc + pg_get_functiondef()
PostgreSQL 把函数(含存储过程)统一管理,定义体不直接存字段里,得靠系统函数还原。最稳的方式是用 pg_get_functiondef(),它能正确处理重载、schema 和权限。
示例(假设过程在 public schema):
SELECT pg_get_functiondef(p.oid) FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid WHERE n.nspname = 'public' AND p.proname = 'my_proc';
关键细节:
- 不要直接查
pg_proc.prosrc字段——那是源码快照,可能被格式化或截断,且不含CREATE OR REPLACE头部 - 如果过程有参数,
proname可能重复,建议补上proargtypes或用pg_get_function_identity_arguments()辅助定位 - 超级用户才能看到所有函数定义;普通用户只能看到自己有
EXECUTE权限的那些
跨平台脚本里别硬编码,优先走 INFORMATION_SCHEMA(有限支持)
INFORMATION_SCHEMA.ROUTINES 看起来通用,但实际很鸡肋:MySQL 里 ROUTINE_DEFINITION 字段总是 NULL;SQL Server 根本不实现这个视图;PostgreSQL 虽然有,但定义体仍为空。
所以真要写兼容脚本,得按数据库类型分路径,别指望一条 SQL 走天下。最容易漏掉的是权限检查——开发环境能跑的语句,上线后常因权限收紧而静默失败,定义查不出来也不会报错,只会返回空结果集。

















