show create procedure 可获取存储过程完整定义,但需先执行 use 指定数据库,否则报错;必须具备 select 权限(mysql.routines 视图,mysql 8.0+),且注意 sql_mode 和 character_set_client 等上下文影响重建一致性。

直接用 SHOW CREATE PROCEDURE 就能拿到完整定义,但必须注意权限、数据库上下文和字符集陷阱。
执行 SHOW CREATE PROCEDURE 前必须先选库
MySQL 不支持跨库直接查存储过程定义。如果你没提前执行 USE your_db_name,哪怕你知道过程名,SHOW CREATE PROCEDURE proc_name 也会报错:ERROR 1305 (42000): PROCEDURE your_db_name.proc_name does not exist —— 注意它默认往当前数据库里找,而不是全局搜索。
- 正确做法:先
USE target_db,再SHOW CREATE PROCEDURE proc_name - 如果不确定过程在哪,先用
SHOW PROCEDURE STATUS LIKE 'proc_name'查Db字段定位库名 - 不能省略库名拼接(比如
SHOW CREATE PROCEDURE target_db.proc_name)——语法不支持
SHOW CREATE PROCEDURE 返回的字段含义和常见干扰项
结果里最关键的不是 Procedure 或 Create Procedure 行,而是 sql_mode 和注释块里的字符集声明。它们决定了你复制语句后能否在别的环境重建成功。
-
Create Procedure字段包含完整 SQL,但会自动加上DELIMITER切换逻辑(如$$),实际复制时得手动还原成;结束符 -
sql_mode值(如STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION)会影响参数校验和空值处理,重建时最好显式带上SET sql_mode = 'xxx' - 返回中可能含
character_set_client和collation_connection,若源库用utf8mb4而目标库是utf8,复制过去可能触发乱码或报错
遇到 Access denied 或空结果怎么办
不是所有用户都有查看存储过程定义的权限。即使你能调用它,也不代表能看到源码。
- 必需权限:至少要有
SELECT权限在mysql.proc表上(MySQL 5.7 及以前)或SELECT权限在mysql.routines视图上(MySQL 8.0+) - 常见误判:用
SHOW CREATE PROCEDURE报Access denied,但SHOW PROCEDURE STATUS却能返回基本信息 —— 后者只读元数据,权限要求更低 - 如果返回空结果,检查是否拼写错误(大小写敏感取决于
lower_case_table_names设置),或该过程确实不存在于当前库
最常被忽略的是 sql_mode 和字符集上下文 —— 它们不会报错,但会导致你复制过去的语句在别的实例里行为不一致,尤其是涉及时间函数、字符串截断或严格模式开关时。











