error 1370或1418根本原因非调用者缺权限,而是definer用户不存在/权限不足(含system_variables_admin)或log_bin_trust_function_creators未启用;须先查show create function确认definer与sql security,再验证用户存在性、跨库权限及该全局变量设置。

函数创建失败报 ERROR 1370 或 ERROR 1418,根本不是调用者缺权限,而是定义者(DEFINER)不存在、权限不全,或没开 log_bin_trust_function_creators——直接给当前用户加 CREATE ROUTINE 可能治标不治本。
CREATE FUNCTION 报 ERROR 1370 怎么确认缺什么权限
错误提示里明确写了“CREATE ROUTINE command denied”,说明当前连接用户缺少 CREATE ROUTINE 权限。但注意:这个权限和 CREATE 数据库权限是两回事,必须显式授予。
- 先查自己是谁:
SELECT USER(), CURRENT_USER();——重点看CURRENT_USER()输出的'user'@'host'格式 - 再查已有权限:
SHOW GRANTS FOR CURRENT_USER;,确认输出里有没有CREATE ROUTINE - 如果只有
GRANT SELECT, INSERT ON `db`.* TO ...这类语句,就说明真缺这个权限 - 别信“我有 ALL PRIVILEGES”——MySQL 的
ALL PRIVILEGES默认不含CREATE ROUTINE,除非显式包含
GRANT CREATE ROUTINE 时最容易踩的三个坑
授完权还报错,大概率栽在这几个细节上:
-
GRANT CREATE ROUTINE ON *.* TO 'user'@'host';是全局授权;如果只想在某个库建函数,得写成GRANT CREATE ROUTINE ON `mydb`.* TO 'user'@'host';,否则函数体里跨库访问时仍可能失败 -
'user'@'localhost'和'user'@'%'是两个独立账号,应用连的是127.0.0.1(TCP),就不能只给localhost授权 - 授完权后没执行
FLUSH PRIVILEGES;——虽然GRANT语句通常自动刷新,但在某些 MySQL 版本或配置下(比如直改mysql.user表),这步不能跳过
函数体里用了系统变量或跨库查询,DEFINER 权限还得补
即使 CREATE FUNCTION 成功了,后续调用时崩在 ERROR 1418,问题往往出在 DEFINER 身上:
- 用
SHOW CREATE FUNCTION func_name;查定义,看DEFINER=`u`@`h`和有没有SQL SECURITY DEFINER(默认就是它) - 如果
DEFINER是'nobody'@'%'或已删用户,函数根本跑不起来——得重建该用户,或用ALTER FUNCTION ... SQL SECURITY INVOKER改执行模式 - MySQL 8.0+ 中,函数若读
@@version、@@sql_mode等系统变量,DEFINER必须有SYSTEM_VARIABLES_ADMIN权限,不是SUPER - 函数里写了
SELECT * FROM other_db.t?那DEFINER得有other_db的SELECT权限,光有当前库权限不够
Docker / RDS 环境下 log_bin_trust_function_creators 必须设
在容器或云数据库里,log_bin_trust_function_creators 默认是 OFF,会导致函数创建或调用直接被拒,哪怕权限全都有:
- 临时启用:
SET GLOBAL log_bin_trust_function_creators = 1;(需SYSTEM_VARIABLES_ADMIN权限) - 持久化:往
my.cnf的[mysqld]段加一行log_bin_trust_function_creators=1,然后重启 MySQL - 阿里云 RDS、腾讯云 CDB 等平台,这个参数通常只能通过控制台或 API 修改,不能用
SET GLOBAL - 不设这个,
DETERMINISTIC或READS SQL DATA声明也救不了——MySQL 会直接拒绝创建
真正卡住人的地方,从来不是“要不要授 CREATE ROUTINE”,而是 DEFINER 用户是否存在、有没有跨库权限、是否漏了 SYSTEM_VARIABLES_ADMIN,以及 log_bin_trust_function_creators 在容器或云环境里根本没开——这些点不逐个核对,光加权限没用。











