授予EVENT权限需SUPER(MySQL 5.7)或SYSTEM_VARIABLES_ADMIN+ROLE_ADMIN(8.0.16+),且必须全局授权;EVENT本身仅为开关,创建/管理事件还需CREATE/DROP/ALTER EVENT权限,DEFINER必须存在、有效并具备事件内操作所需最小权限。

授予用户 EVENT 权限需要 SUPER 或 SYSTEM_VARIABLES_ADMIN(MySQL 8.0.16+)
在 MySQL 中,EVENT 权限本身不足以创建或管理事件调度器——它只是“开关”,真正决定能否创建/修改/删除事件的是用户的 CREATE EVENT、DROP EVENT 和 ALTER EVENT 权限。但关键限制在于:只有拥有 SUPER 权限(MySQL 5.7 及以前)或 SYSTEM_VARIABLES_ADMIN + ROLE_ADMIN(MySQL 8.0.16+)的用户,才能设置事件的 DEFINER 为他人。普通用户即使被授了 EVENT,也只能创建 DEFINER = CURRENT_USER 的事件。
- MySQL 5.7:执行
GRANT EVENT ON *.* TO 'user'@'host';即可启用事件功能,但若想指定DEFINER = 'admin'@'%',必须先给该用户SUPER - MySQL 8.0.16+:
SUPER已弃用,需用GRANT SYSTEM_VARIABLES_ADMIN, ROLE_ADMIN ON *.* TO 'user'@'host';替代 - 权限作用域必须是全局(
ON *.*),不能限定到库或表;EVENT是服务器级权限
检查事件定义者(DEFINER)是否生效且可访问
事件创建后,DEFINER 决定了事件运行时的权限上下文。如果定义者账号不存在、被锁定、或密码过期,事件会静默失败(MySQL 错误日志里可能只写 Failed to open the event,不报具体原因)。
- 查当前事件及其定义者:
SELECT EVENT_SCHEMA, EVENT_NAME, DEFINER, STATUS FROM information_schema.EVENTS; - 确认定义者账号存在且可用:
SELECT User, Host, Account_locked, Password_expired FROM mysql.user WHERE User = 'xxx' AND Host = 'yyy'; - 如果定义者是
'definer_user'@'localhost',但事件在远程客户端触发,注意localhost不等价于127.0.0.1(Unix socket vs TCP),可能导致权限匹配失败
创建事件时显式指定 DEFINER 的实际效果
显式写 DEFINER = 'u'@'h' 并非“赋予 u 权限”,而是声明“这个事件以 u 的身份运行”。所以 u 必须对事件体中涉及的所有对象(如 UPDATE tbl)有对应权限——哪怕你是 root 创建的事件,只要 DEFINER = 'nobody'@'%',而 nobody 没有 UPDATE 权限,事件照样报错 ERROR 1142 (42000): UPDATE command denied。
- 安全起见,建议始终用
DEFINER = CURRENT_USER(MySQL 默认行为),避免隐式依赖高权限账号 - 若必须用固定定义者,确保该账号仅拥有事件所需最小权限(比如只给目标表的
SELECT, INSERT,别给DROP TABLE) - MySQL 8.0 默认开启
sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION',若事件里有非法值插入,会直接中断执行,不会跳过
常见错误:Event created but never runs,或日志里出现 “No database selected”
这往往不是权限问题,而是事件体里没指定默认数据库,或 DEFINER 账号没有 USAGE 权限以外的任何数据库权限。
- 事件 SQL 里所有表名必须带库名前缀,例如
UPDATE mydb.mytable SET ...,不能只写UPDATE mytable - 即使事件在
mydb下创建,DEFINER也必须有mydb.*的SELECT/INSERT/UPDATE等具体权限 - 检查
event_scheduler是否开启:SHOW VARIABLES LIKE 'event_scheduler';,值必须是ON(不是1或YES) - MySQL 8.0 默认关闭事件调度器,首次启用需
SET GLOBAL event_scheduler = ON;,且该设置重启失效,需写入配置文件my.cnf的[mysqld]段落加event_scheduler=ON
定义者权限链容易断在中间一环:账号存在 ≠ 密码有效 ≠ 有对应库权限 ≠ 事件 SQL 语法兼容当前 sql_mode。调试时优先看错误日志里的具体 SQL 报错,而不是只盯着 EVENT 权限。


















