要启用或禁用计划事件的执行,必须设置全局变量的值event_scheduler
系统变量。这需要足够的权限来设置全局系统变量。看到第5.1.9.1节,“系统变量特权”.
的事件
特权管理事件的创建、修改和删除。这种特权可以通过使用格兰特
.例如,这个格兰特
语句授予事件
所命名的模式的特权myschema
关于用户jon@ghidora
:
在我的模式上授予事件。*致jon@ghidora;
(我们假设这个用户帐户已经存在,并且我们希望它保持不变。)
授予该用户事件
所有模式上的特权,使用以下语句:
*.*上的Grant事件TO jon@ghidora;
的事件
特权具有全局或模式级作用域。因此,尝试在单个表上授予它会导致如下所示的错误:
mysql> GRANT EVENTmytable TO jon@ghidora;ERROR 1144(42000):非法的GRANT/REVOKE命令;请查阅手册以了解可以使用哪些特权
重要的是要理解事件是使用其定义者的特权执行的,并且它不能执行其定义者没有必要特权的任何操作。例如,假设jon@ghidora
有事件
特权的myschema
.还假设该用户拥有选择
特权的myschema
,但没有此模式的其他特权。这是可能的jon@ghidora
创建一个类似这样的新事件:
每10秒创建事件e_store_ts插入到myschema中。mytable VALUES (UNIX_TIMESTAMP());
用户等待一分钟左右,然后执行一个SELECT * FROM mytable;
查询,期望在表中看到几个新行。相反,该表是空的。因为用户没有插入
对于所讨论的表,该事件没有影响。
如果检查MySQL错误日志(
),你可以看到事件正在执行,但是它试图执行的动作失败了:主机名
.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 myschemamytableVALUES (UNIX_TIMESTAMP()); ERROR 1142 (42000): INSERT command denied to user 'jon'@'ghidora' for table 'mytable'
检查INFORMATION_SCHEMA。事件
表格显示e_store_ts
存在且已启用,但其LAST_EXECUTED
列是零
:
mysql> SELECT * FROM INFORMATION_SCHEMA事件> 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)
取消事件
特权,使用撤销
声明。在本例中,事件
模式上的特权myschema
从jon@ghidora
用户帐号:
在我的模式上撤销事件。*来自jon@ghidora;
假设用户jon@ghidora
已被授予事件
而且插入
的特权myschema
模式。该用户然后创建以下事件:
每7秒创建一个插入事件到myschema.mytable;
创建此事件后,根
撤销的事件
特权的jon@ghidora
.然而,e_insert
继续执行,将新行插入mytable
每七秒。如果根
曾发表下列声明之一:
DROP USER jon@ghidora;
重命名用户jon@ghidora到someotherguy@ghidora;
可以通过检查INFORMATION_SCHEMA。事件
表(参见章节26.3.14,“INFORMATION_SCHEMA事件表”)在发出减少用户
或重命名用户
声明。
事件定义存储在数据字典中。要删除由其他用户帐户创建的事件,您必须是MySQL根
用户或具有必要权限的其他用户。
用户的事件
权限存储在Event_priv
的列mysql.user
而且mysql.db
表。在这两种情况下,这一列都包含一个值Y
或'N
“。”N
'是默认值。mysql.user.Event_priv
设置为'Y
'仅当给定用户具有全局变量时事件
特权(即,如果特权被授予使用*.*上的Grant事件
).对于模式级事件
特权,格兰特
中创建行的mysql.db
并设置这一行Db
列设置为模式的名称,则用户
列设置为用户的名称,而Event_priv
列到'Y
”。应该永远不需要直接操作这些表,因为格兰特事件
而且撤销事件
语句对它们执行所需的操作。
5个状态变量提供事件相关操作的计数(但是不由事件执行的语句;看到第25.8节“存储程序的限制”).这些都是:
您可以通过运行该语句一次查看所有这些的当前值显示状态像'%事件%';
.