show create procedure 报“procedure does not exist”错,主因是未指定数据库或未use目标库;definer字段标识创建者用户,影响权限校验,不可删但可重建时修改;源码无注释和格式化,因存储为二进制ast。

SHOW CREATE PROCEDURE 执行报错:PROCEDURE does not exist
这是最常遇到的错误,不是语法写错了,而是 MySQL 默认只查当前数据库下的存储过程。如果你没先 USE database_name,或者没在语句里指定库名,就会报这个错。
实操建议:
- 确认当前数据库:
SELECT DATABASE(); - 查所有库里的过程名:
SELECT ROUTINE_SCHEMA, ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE'; - 带库名执行:
SHOW CREATE PROCEDURE mydb.my_proc;(注意中间是英文点号,不是下划线)
SHOW CREATE PROCEDURE 返回的 DEFINER 字段是谁?能删吗?
返回结果第一行类似 CREATE DEFINER=`root`@`localhost` PROCEDURE `my_proc`...,这个 DEFINER 是创建时的用户,不是执行时的用户。它影响权限检查逻辑——MySQL 会按这个用户身份去校验内部 SQL 是否有权限,而不是调用者。
容易踩的坑:
- 迁移存储过程到新环境后,原
DEFINER用户不存在,可能导致调用失败(尤其涉及跨库查询时) -
DEFINER不能直接删,但可以改:导出后手动替换为DEFINER=CURRENT_USER或具体存在的账号,再用CREATE PROCEDURE重建 - 如果只是想看逻辑,
DEFINER字段本身不影响SHOW CREATE PROCEDURE的输出完整性
为什么用 SHOW CREATE PROCEDURE 看不到注释或格式化代码?
MySQL 存储过程的源码是以紧凑单行形式保存在 mysql.proc 表里的,SHOW CREATE PROCEDURE 只做原始还原,不做美化。你看到的换行、缩进、注释(比如 -- 或 /* */)在创建时就被剥离或压缩了。
说明:
- 存储过程体(
body)字段类型是longblob,内容是二进制序列化后的 AST,不是纯文本 - 注释只有在创建语句中出现在
CREATE PROCEDURE关键字之前,才可能保留在返回结果头部;过程体内的注释基本不保留 - 如果需要可读性,建议把源码存在外部版本库,而不是依赖数据库反查
替代方案:从 INFORMATION_SCHEMA.ROUTINES 查源码靠谱吗?
可以查,但不推荐直接用。因为 INFORMATION_SCHEMA.ROUTINES 表里的 ROUTINE_DEFINITION 字段在 MySQL 8.0+ 默认为 NULL(出于安全考虑),除非开启 show_compatibility_56=ON 并重启,且该配置已弃用。
实操判断:
- 先试:
SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'my_proc' AND ROUTINE_SCHEMA = 'mydb'; - 如果返回
NULL,别折腾配置,老实用SHOW CREATE PROCEDURE - 注意:该表不包含
DEFINER和SQL SECURITY信息,这两项对权限行为很关键
真正麻烦的不是怎么查,而是查出来之后发现逻辑和你记忆中的不一样——可能早被别人改过但没同步文档,也可能自己上次改完忘了 DELIMITER 没切回来导致部分语句没生效。源码在数据库里,从来都不等于“最新可信版本”。










