### 25.4.6 事件调度程序和 MySQL 权限

[](<>)

要启用或禁用计划事件的执行，需要设置全局的值[`event_scheduler`](server-system-variables.html#sysvar_event_scheduler)系统变量。这需要足够的权限来设置全局系统变量。看[第 5.1.9.1 节，“系统变量权限”](system-variable-privileges.html).

这[`事件`](privileges-provided.html#priv_event)权限控制事件的创建、修改和删除。可以使用授予此特权[`授予`](grant.html).例如，这个[`授予`](grant.html)声明赋予[`事件`](privileges-provided.html#priv_event)名为的架构的特权`架构`在用户上`乔恩@吉多拉`：

```
GRANT EVENT ON myschema.* TO jon@ghidora;
```

（我们假设这个用户帐户已经存在，并且我们希望它保持不变。）

要授予同一用户[`事件`](privileges-provided.html#priv_event)所有模式的特权，使用以下语句：

```
GRANT EVENT ON *.* TO jon@ghidora;
```

这[`事件`](privileges-provided.html#priv_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
```

重要的是要了解事件是以其定义者的特权执行的，并且它不能执行其定义者没有必要特权的任何操作。例如，假设`乔恩@吉多拉`有[`事件`](privileges-provided.html#priv_event)特权`架构`.还假设这个用户有[`选择`](privileges-provided.html#priv_select)特权`架构`，但没有此架构的其他权限。这是可能的`乔恩@吉多拉`创建一个新事件，例如这个：

```
CREATE EVENT e_store_ts
    ON SCHEDULE
      EVERY 10 SECOND
    DO
      INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());
```

用户等待一分钟左右，然后执行`选择 * 从我的表；`查询，期望在表中看到几个新行。相反，该表是空的。由于用户没有[`插入`](privileges-provided.html#priv_insert)有问题的表的权限，该事件没有影响。

如果您检查 MySQL 错误日志 (`*`主机名`*。呃`)，您可以看到事件正在执行，但它尝试执行的操作失败：

```
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`](information-schema-events-table.html)表显示`e_store_ts`存在且已启用，但其`LAST_EXECUTED`列是`空值`：

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

撤销[`事件`](privileges-provided.html#priv_event)特权，使用[`撤销`](revoke.html)陈述。在这个例子中，[`事件`](privileges-provided.html#priv_event)架构上的特权`架构`被从`乔恩@吉多拉`用户帐号：

```
REVOKE EVENT ON myschema.* FROM jon@ghidora;
```

重要的

撤销[`事件`](privileges-provided.html#priv_event)用户的权限不会删除或禁用该用户可能已创建的任何事件。

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

假设用户`乔恩@吉多拉`已被授予[`事件`](privileges-provided.html#priv_event)和[`插入`](privileges-provided.html#priv_insert)上的特权`架构`架构。然后该用户创建以下事件：

```
CREATE EVENT e_insert
    ON SCHEDULE
      EVERY 7 SECOND
    DO
      INSERT INTO myschema.mytable;
```

创建此事件后，`根`撤销[`事件`](privileges-provided.html#priv_event)特权`乔恩@吉多拉`.然而，`e_insert`继续执行，将新行插入`我的表`每七秒。如果`根`已发表以下声明：

-   `删除用户 jon@ghidora;`

-   `将用户 jon@ghidora 重命名为 someotherguy@ghidora；`

    您可以通过检查[`INFORMATION_SCHEMA.EVENTS`](information-schema-events-table.html)表（见[第 26.3.14 节，“信息\_架构事件表“](information-schema-events-table.html))签发[`删除用户`](drop-user.html)或[`重命名用户`](rename-user.html)陈述

    事件定义存储在数据字典中。要删除由另一个用户帐户创建的事件，必须是MySQL`根`用户或具有必要权限的其他用户。

    用户的[`事件`](privileges-provided.html#priv_event)特权存储在`私人活动`专栏`mysql。使用者`和`mysql。分贝`桌子。在这两种情况下，此列都包含一个`Y`“或者”`N`'. '`N`'是默认值。`mysql。使用者私人活动`设置为'`Y`'仅当给定用户具有全局[`事件`](privileges-provided.html#priv_event)特权（即，如果特权是使用`授予*上的活动*`).用于架构级别[`事件`](privileges-provided.html#priv_event)特权[`授予`](grant.html)在中创建一行`mysql。分贝`把那排排`分贝`列中指定模式的名称`使用者`列的名称，以及`私人活动`列至'`Y`“。不应该有任何需要直接操作这些表，因为[`格兰特事件`](grant.html)和`撤销事件`语句对它们执行所需的操作。

[](<>)

五个状态变量提供事件相关操作的计数（但是*不*由事件执行的声明；看见[第25.8节，“对存储程序的限制”](stored-program-restrictions.html))1.这些是：

-   `Com_创建_事件`：人数[`创建事件`](create-event.html)自上次服务器重启以来执行的语句。

-   `Com_alter_事件`：人数[`改变事件`](alter-event.html)自上次服务器重启以来执行的语句。

-   `Com_drop_事件`：人数[`丢弃事件`](drop-event.html)自上次服务器重启以来执行的语句。

-   `Com_show_create_活动`：人数[`显示创建事件`](show-create-event.html)自上次服务器重启以来执行的语句。

-   `Com_show_活动`：人数[`展示活动`](show-events.html)自上次服务器重启以来执行的语句。

    通过运行语句，可以一次查看所有这些的当前值`显示状态，如“%event%”；`.
