要启用或禁用计划事件的执行,必须设置全局 event_scheduler
系统变量的值。这需要设置全局系统变量的足够权限。请参阅 第 7.1.9.1 节,“系统变量权限”。
The EVENT
权限控制事件的创建、修改和删除。可以使用 GRANT
来授予此权限。例如,以下 GRANT
语句为名为 myschema
的架构授予用户 jon@ghidora
EVENT
权限
Press CTRL+C to copyGRANT EVENT ON myschema.* TO jon@ghidora;
(我们假设此用户帐户已存在,并且我们希望它在其他方面保持不变。)
要授予此同一用户对所有架构的 EVENT
权限,请使用以下语句
Press CTRL+C to copyGRANT EVENT ON *.* TO jon@ghidora;
The EVENT
权限具有全局或架构级范围。因此,尝试在单个表上授予它会导致错误,如下所示
Press CTRL+C to copymysql> GRANT EVENT ON myschema.mytable TO jon@ghidora; ERROR 1144 (42000): Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used
重要的是要了解事件以其定义者的权限执行,并且它不能执行其定义者没有必要权限的任何操作。例如,假设 jon@ghidora
对 myschema
具有 EVENT
权限。还假设此用户对 myschema
具有 SELECT
权限,但对该架构没有其他权限。jon@ghidora
可以创建类似以下内容的新事件
Press CTRL+C to copyCREATE EVENT e_store_ts ON SCHEDULE EVERY 10 SECOND DO INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());
该用户等待一分钟左右,然后执行 SELECT * FROM mytable;
查询,希望看到表中新增了几行。但是,该表是空的。由于该用户没有对该表具有 INSERT
权限,因此该事件无效。
如果您检查 MySQL 错误日志 (
),您可以看到事件正在执行,但它尝试执行的操作失败hostname
.err
Press CTRL+C to copy2013-09-24T12:41:31.261992Z 25 [ERROR] Event Scheduler: [jon@ghidora][cookbook.e_store_ts] INSERT command denied to user 'jon'@'ghidora' for table 'mytable' 2013-09-24T12:41:31.262022Z 25 [Note] Event Scheduler: [jon@ghidora].[myschema.e_store_ts] event execution failed. 2013-09-24T12:41:41.271796Z 26 [ERROR] Event Scheduler: [jon@ghidora][cookbook.e_store_ts] INSERT command denied to user 'jon'@'ghidora' for table 'mytable' 2013-09-24T12:41:41.272761Z 26 [Note] Event Scheduler: [jon@ghidora].[myschema.e_store_ts] event execution failed.
由于此用户很可能无法访问错误日志,因此可以通过直接执行事件的操作语句来验证它是否有效
Press CTRL+C to copymysql> INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP()); ERROR 1142 (42000): INSERT command denied to user 'jon'@'ghidora' for table 'mytable'
检查 Information Schema EVENTS
表显示 e_store_ts
存在且已启用,但其 LAST_EXECUTED
列为 NULL
Press CTRL+C to copymysql> SELECT * FROM INFORMATION_SCHEMA.EVENTS > WHERE EVENT_NAME='e_store_ts' > AND EVENT_SCHEMA='myschema'\G *************************** 1. row *************************** EVENT_CATALOG: NULL EVENT_SCHEMA: myschema EVENT_NAME: e_store_ts DEFINER: jon@ghidora EVENT_BODY: SQL EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP()) EVENT_TYPE: RECURRING EXECUTE_AT: NULL INTERVAL_VALUE: 5 INTERVAL_FIELD: SECOND SQL_MODE: NULL STARTS: 0000-00-00 00:00:00 ENDS: 0000-00-00 00:00:00 STATUS: ENABLED ON_COMPLETION: NOT PRESERVE CREATED: 2006-02-09 22:36:06 LAST_ALTERED: 2006-02-09 22:36:06 LAST_EXECUTED: NULL EVENT_COMMENT: 1 row in set (0.00 sec)
要撤销 EVENT
权限,请使用 REVOKE
语句。在此示例中,myschema
架构上的 EVENT
权限将从用户帐户 jon@ghidora
中删除
Press CTRL+C to copyREVOKE EVENT ON myschema.* FROM jon@ghidora;
假设用户 jon@ghidora
已被授予对 myschema
架构的 EVENT
和 INSERT
权限。然后,此用户创建以下事件
Press CTRL+C to copyCREATE EVENT e_insert ON SCHEDULE EVERY 7 SECOND DO INSERT INTO myschema.mytable;
创建此事件后,root
撤销了 jon@ghidora
的 EVENT
权限。但是,e_insert
继续执行,每隔七秒将一行插入到 mytable
中。如果 root
发出了以下任何语句,情况也会相同
DROP USER jon@ghidora;
RENAME USER jon@ghidora TO someotherguy@ghidora;
您可以通过在发出 DROP USER
或 RENAME USER
语句之前和之后检查 Information Schema EVENTS
表来验证这一点。
事件定义存储在数据字典中。要删除由另一个用户帐户创建的事件,您必须是 MySQL root
用户或具有必要权限的另一个用户。
用户的 EVENT
权限存储在 mysql.user
和 mysql.db
表的 Event_priv
列中。在这两种情况下,此列都包含以下值之一:'Y
' 或 'N
'。'N
' 是默认值。仅当给定用户具有全局 EVENT
权限(即,如果权限是使用 GRANT EVENT ON *.*
授予的)时,mysql.user.Event_priv
才设置为 'Y
'。对于架构级 EVENT
权限,GRANT
在 mysql.db
中创建一个行,并将该行的 Db
列设置为架构的名称,User
列设置为用户的名称,Event_priv
列设置为 'Y
'。永远不需要直接操作这些表,因为 GRANT EVENT
和 REVOKE EVENT
语句会对它们执行必要的操作。
五个状态变量提供了与事件相关的操作的计数(但不包括事件执行的语句;请参阅 第 27.9 节,“存储程序限制”)。它们是
Com_create_event
:自上次服务器重启以来执行的CREATE EVENT
语句数。Com_alter_event
:自上次服务器重启以来执行的ALTER EVENT
语句数。Com_drop_event
:自上次服务器重启以来执行的DROP EVENT
语句数。Com_show_create_event
:自上次服务器重启以来执行的SHOW CREATE EVENT
语句数。Com_show_events
:自上次服务器重启以来执行的SHOW EVENTS
语句数。
您可以通过运行语句 SHOW STATUS LIKE '%event%';
来查看所有这些状态变量的当前值。