事件调度程序和MySQL特权
要启用或禁用调度事件的执行,必须设置全局event_scheduler
系统变量的值。这需要足以设置全局系统变量的特权。请参见“系统变量特权”。
该EVENT
特权控制事件的创建,修改和删除。可以使用授予该特权GRANT
。例如,以下GRANT
语句EVENT
为myschema
用户指定的架构授予特权jon@ghidora
:
GRANT EVENT ON myschema.*TO jon@ghidora;
(我们假定此用户帐户已经存在,否则我们希望它保持不变。)
要向同一用户授予EVENT
所有模式的特权,请使用以下语句:
GRANT EVENT ON *.*TO jon@ghidora;
该EVENT
特权具有全局或架构级别的范围。因此,尝试在单个表上授予它会导致错误,如下所示:
mysql>GRANT EVENT ON myschema.mytableTO jon@ghidora; ERROR 1144 (42000): Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used
重要的是要了解事件是使用其定义者的特权执行的,并且它无法执行其定义者没有必要特权的任何操作。例如,假设jon@ghidora
具有的EVENT
特权myschema
。还假设该用户具有的SELECT
特权myschema
,但是对该架构没有其他特权。可以jon@ghidora
创建一个新事件,例如:
CREATE EVENT e_store_tsON SCHEDULE EVERY 10SECOND DO INSERT INTO myschema.mytableVALUES (UNIX_TIMESTAMP());
用户等待一分钟左右,然后执行SELECT * FROM mytable;
查询,期望在表中看到几个新行。而是,该表为空。由于用户不具有所INSERT
讨论表的特权,因此该事件无效。
如果检查MySQL错误日志(hostname.err
),则可以看到该事件正在执行,但是尝试执行的操作失败:
2013-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.
由于此用户很可能无权访问错误日志,因此可以通过直接执行事件来验证事件的动作语句是否有效:
mysql>INSERT INTO myschema.mytableVALUES (UNIX_TIMESTAMP()); ERROR 1142 (42000): INSERT command denied to user 'jon'@'ghidora' for table 'mytable'
检查INFORMATION_SCHEMA.EVENTS
表显示该表已e_store_ts
存在并已启用,但其LAST_EXECUTED
列为NULL
:
mysql>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
语句。在此示例中,该EVENT
模式的特权myschema
已从jon@ghidora
用户帐户中删除:
REVOKE EVENT ON myschema.*FROM jon@ghidora;
重要撤消
EVENT
用户的特权不会删除或禁用该用户可能创建的任何事件。重命名或删除创建事件的用户不会迁移或删除事件。
假设jon@ghidora
已向用户授予模式的EVENT
和INSERT
特权myschema
。然后,该用户创建以下事件:
CREATE EVENT e_insertON SCHEDULE EVERY 7SECOND DO INSERT INTO myschema.mytable;
创建此事件后,root
撤消对的EVENT
特权jon@ghidora
。但是,e_insert
继续执行,mytable
每7秒插入一个新行。如果root
发布了以下任一声明,则同样如此:
DROP USER jon@ghidora;
RENAME USER jon@ghidora TO someotherguy@ghidora;
您可以在发出or 语句之前和之后检查INFORMATION_SCHEMA.EVENTS
表(请参见“ INFORMATION_SCHEMA事件表”)来验证这是正确的。DROP USER
RENAME USER
事件定义存储在数据字典中。要删除由另一个用户帐户创建的事件,您必须是MySQL root
用户或具有必要特权的另一个用户。
用户的EVENT
权限存储在和表的Event_priv
列中。在这两种情况下,此列均包含值“”或“”之一。默认为''。仅在给定用户具有全局特权(即,使用授予该特权)的情况下,才将该用户设置为'' 。要获得架构级别的权限,请在中创建一行,并将该行的列设置为架构名称,将该列设置为用户名称,并将该列设置为“mysql.user
mysql.db
Y
N
N
mysql.user.Event_priv
Y
EVENT
GRANT EVENT ON *.*
EVENT
GRANT
mysql.db
Db
User
Event_priv
Y
'。永远不需要直接操作这些表,因为GRANT EVENT
and REVOKE EVENT
语句对它们执行必需的操作。
五个状态变量提供了事件相关操作的计数(但不包括事件执行的语句的计数;请参见“对存储程序的限制”)。这些是:
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%';
。