ERROR 1419 根本原因是 binlog 启用时 MySQL 强制要求非确定性触发器创建者被信任,而非缺少 TRIGGER 权限;需设 log_bin_trust_function_creators=1 并确保 DEFINER 用户存在、权限完备且 host 完全匹配。

为什么 CREATE TRIGGER 报 ERROR 1419 而不是权限不足提示
因为 MySQL 把「创建触发器」和「触发器执行」拆成两套权限校验:报 ERROR 1419 不代表你没 TRIGGER 权限,而是 binlog 开着(log_bin=ON,5.7+ 默认开启)时,MySQL 强制要求非确定性操作(比如 NOW()、UUID()、子查询、函数调用)的创建者被信任——它不看你有没有 SUPER,只看你是否被允许绕过安全检查。
常见错误现象:
- 用普通账号执行
CREATE TRIGGER直接失败,提示You do not have the SUPER privilege and binary logging is enabled -
SHOW GRANTS FOR CURRENT_USER明明有TRIGGER权限,还是报错 - 云数据库(如阿里云 RDS)上死活加不了
SUPER,GRANT 语句直接报错
log_bin_trust_function_creators=1 是唯一可行解
这不是“妥协方案”,而是 MySQL 官方在启用 binlog 场景下的标准路径。云厂商禁用 SUPER,正是为了逼你走这条路。
实操建议:
- 临时生效(需
SYSTEM_VARIABLES_ADMIN权限):SET GLOBAL log_bin_trust_function_creators = 1; - 持久化配置(推荐):编辑
my.cnf(Linux)或my.ini(Windows),在[mysqld]段下加一行:log_bin_trust_function_creators=1,然后重启 mysqld - 验证是否生效:
SELECT @@log_bin_trust_function_creators;返回1即成功 - 注意:该设置不影响 DEFINER 权限校验,只放开创建/执行非确定性逻辑的限制
DEFINER 用户不存在或权限缺失才是执行时报错的主因
创建成功 ≠ 触发成功。很多人在 log_bin_trust_function_creators 设为 1 后仍遇到 ERROR 1419 或 Access denied for trigger execution,问题已切换到 DEFINER 身上。
关键检查步骤:
- 查触发器定义:
SHOW CREATE TRIGGER trigger_name;,紧盯DEFINER=`xxx`@`yyy`这一行 - 确认该用户真实存在:
SELECT User, Host FROM mysql.user WHERE User = 'xxx';,注意大小写和Host必须完全匹配 - 查其权限:
SHOW GRANTS FOR 'xxx'@'yyy';,重点核对是否含触发器内所有 SQL 涉及的库表权限,例如INSERT ON log_db.audit_log - 跨库操作必须单独授权:若触发器里写了
UPDATE report.stats SET cnt = cnt + 1,DEFINER 就得同时有report和原表所在库的权限
别碰 SUPER,尤其在生产环境
给应用账号授 SUPER 是高危操作,且在大多数云数据库上根本不可行。MySQL 8.0+ 已明确将 TRIGGER 拆为独立权限,SUPER 不再是创建触发器的必要条件。
容易踩的坑:
-
GRANT ALL ON *.* TO 'user'@'%'不等于有SUPER(5.7+ 中ALL不包含SUPER) - 误以为
CREATE或ALTER权限能替代TRIGGER权限,其实不行 - 在 RDS 上执行
GRANT SUPER报错后,转头去改应用代码硬编码root,反而埋下更大风险 - 忽略 DEFINER 的
Host字段细节,比如'app'@'192.168.1.%'和'app'@'%'是两个账号
真正要动的就两件事:设好 log_bin_trust_function_creators,再把 DEFINER 账号的存在性、权限范围、host 匹配全对齐。其余全是干扰项。


















