相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 235.4 kb
手册页(邮政编码)- 347.1 kb
信息(Gzip)- 3.3 mb
信息(邮政编码)- 3.3 mb
本手册节选

23.4.6事件调度器和MySQL权限

要启用或禁用计划事件的执行,必须设置global的值event_scheduler系统变量。这需要足够的权限来设置全局系统变量。看到第5.1.8.1节,“系统变量权限”

事件权限管理事件的创建、修改和删除。这种特权可以使用格兰特.例如,这个格兰特语句授予事件命名模式的特权myschema在用户jon@ghidora

GRANT EVENT ON myschema。* jon@ghidora;

(我们假设该用户帐户已经存在,并且我们希望它保持不变。)

事件所有模式的特权,使用以下语句:

在*.*上授予事件TO jon@ghidora;

事件特权具有全局或模式级作用域。因此,试图在单个表上授予它会导致如下错误:

mysql> GRANT EVENTmytable jon@ghidora;错误1144(42000):非法授予/撤销命令;请参考手册,看看可以使用哪些特权

重要的是要理解,事件是用其定义者的特权执行的,它不能执行其定义者没有必要特权的任何操作。例如,假设jon@ghidora事件特权的myschema.还假设该用户具有选择特权的myschema,但该模式没有其他特权。这是可能的jon@ghidora要创建一个新的事件,比如下面这个:

每10秒定时创建一个EVENT e_store_ts。mytable值(UNIX_TIMESTAMP ());

用户等待一分钟左右,然后执行SELECT * FROM mytable;查询,期望在表中看到几个新行。相反,表是空的。因为用户没有插入对于有问题的表,该事件没有影响。

如果您检查MySQL错误日志(主机名.err),你可以看到事件正在执行,但是它试图执行的动作失败了:

2013-09-24T12:41:31.261992Z 25[错误]事件调度器:[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.

因为这个用户很可能没有访问错误日志,所以可以通过直接执行来验证事件的action语句是否有效:

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>从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)

撤销的事件特权,使用撤销声明。在本例中事件对模式的特权myschemajon@ghidora用户帐号:

撤销模式上的事件。从jon@ghidora *;
重要的

撤销的事件用户的特权不会删除或禁用该用户可能创建的任何事件。

不会因为重命名或删除创建事件的用户而迁移或删除事件。

假设用户jon@ghidora已经被授予事件而且插入特权的myschema模式。然后,该用户创建以下事件:

在myschema.mytable中执行INSERT操作

创建此事件之后,撤销的事件特权的jon@ghidora.然而,e_insert继续执行,将新行插入mytable每7秒。同样的道理也适用于发表了其中一项声明:

  • 删除用户jon@ghidora;

  • 重命名用户jon@ghidora到someotherguy@ghidora;

你可以通过检查mysql.event表(本节稍后讨论)或INFORMATION_SCHEMA。事件表(参见第24.3.8节,“INFORMATION_SCHEMA事件表”)在签发证明书之前及之后减少用户重命名用户声明。

事件定义存储在mysql.event表格要删除由另一个用户帐户创建的事件,MySQL用户(或其他具有必要特权的用户)可以从该表中删除行。例如,删除事件e_insert先前所显示的,可以使用以下语句:

删除从mysql。数据库名称:'e_insert';

控件中删除行的时候,匹配事件名称和数据库模式名称非常重要mysql.event表格这是因为相同名称的不同事件可能存在于不同的模式中。

用户的事件权限存储在Event_priv列的mysql.user而且mysql.db表。在这两种情况下,该列保存值的Y”或“N“。”N'为默认值。mysql.user.Event_priv设置为'Y',仅当该用户具有全局变量时事件特权(也就是说,如果特权被授予使用在*.*上授予事件).对于一个级事件特权,格兰特中创建行。mysql.db然后设置这一行Db的模式名称用户列为用户名,而Event_priv列的Y”。不应该有任何直接操作这些表的需要,因为格兰特事件而且撤销事件语句对它们执行所需的操作。

五个状态变量提供事件相关操作的计数(但是指由事件执行的语句;看到第23.8节,“存储程序的限制”).这些都是:

  • Com_create_event:创建事件自上次服务器重启后执行的语句。

  • Com_alter_event:改变事件自上次服务器重启后执行的语句。

  • Com_drop_event:删除事件自上次服务器重启后执行的语句。

  • Com_show_create_event:显示创建事件自上次服务器重启后执行的语句。

  • Com_show_events:显示事件自上次服务器重启后执行的语句。

您可以通过运行该语句一次查看所有这些参数的当前值SHOW STATUS LIKE '%event ';