• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 事件调度程序和MySQL特权

    要启用或禁用调度事件的执行,必须设置全局event_scheduler系统变量的值。这需要足以设置全局系统变量的特权。请参见“系统变量特权”。

    EVENT特权控制事件的创建,修改和删除。可以使用授予该特权GRANT。例如,以下GRANT语句EVENTmyschema用户指定的架构授予特权jon@ghidora

    GRANT EVENT ON myschema.* TO jon@ghidora;
    

    (我们假定此用户帐户已经存在,否则我们希望它保持不变。)

    要向同一用户授予EVENT所有模式的特权,请使用以下语句:

    GRANT EVENT ON *.* TO jon@ghidora;
    

    EVENT特权具有全局或架构级别的范围。因此,尝试在单个表上授予它会导致错误,如下所示:

    mysql> 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具有的EVENT特权myschema。还假设该用户具有的SELECT特权myschema,但是对该架构没有其他特权。可以jon@ghidora创建一个新事件,例如:

    CREATE EVENT e_store_ts
        ON SCHEDULE
          EVERY 10 SECOND
        DO
          INSERT INTO myschema.mytable VALUES (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.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

    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已向用户授予模式的EVENTINSERT特权myschema。然后,该用户创建以下事件:

    CREATE EVENT e_insert
        ON SCHEDULE
          EVERY 7 SECOND
        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 USERRENAME USER

    事件定义存储在数据字典中。要删除由另一个用户帐户创建的事件,您必须是MySQL root用户或具有必要特权的另一个用户。

    用户的EVENT权限存储在和表的Event_priv列中。在这两种情况下,此列均包含值“”或“”之一。默认为''。仅在给定用户具有全局特权(即,使用授予该特权)的情况下,才将该用户设置为'' 。要获得架构级别的权限,请在中创建一行,并将该行的列设置为架构名称,将该列设置为用户名称,并将该列设置为“mysql.usermysql.dbYNNmysql.user.Event_privYEVENTGRANT EVENT ON *.*EVENTGRANTmysql.dbDbUserEvent_privY'。永远不需要直接操作这些表,因为GRANT EVENTand REVOKE EVENT语句对它们执行必需的操作。

    五个状态变量提供了事件相关操作的计数(但包括事件执行的语句的计数;请参见“对存储程序的限制”)。这些是:

    • Com_create_eventCREATE EVENT自上次服务器重新启动以来执行的语句数。
    • Com_alter_eventALTER EVENT自上次服务器重新启动以来执行的语句数。
    • Com_drop_eventDROP EVENT自上次服务器重新启动以来执行的语句数。
    • Com_show_create_eventSHOW CREATE EVENT自上次服务器重新启动以来执行的语句数。
    • Com_show_eventsSHOW EVENTS自上次服务器重新启动以来执行的语句数。

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