Spec-Zone.ru › MySQL 8.4

27.4.6 Планировщик событий и привилегии MySQL

Для включения или выключения выполнения запланированных событий необходимо установить значение глобальной системной переменной event_scheduler. Это требует привилегий, достаточных для изменения глобальных системных переменных. См. Раздел 7.1.9.1, «Привилегии на системные переменные».

Привилегия 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.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'

Проверка таблицы схемы информации 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_insert
    ON SCHEDULE
      EVERY 7 SECOND
    DO
      INSERT INTO myschema.mytable;

После создания этого события, root отзывает привилегию EVENT для jon@ghidora. Однако e_insert продолжает выполняться, добавляя каждую семь секунд новую строку в mytable. То же самое произошло бы, если бы root выполнил одну из следующих команд:

  • DROP USER jon@ghidora;

  • RENAME USER jon@ghidora TO someotherguy@ghidora;

Вы можете убедиться в этом, изучив таблицу схемы информации EVENTS до и после выполнения команды 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 и REVOKE EVENT выполняют необходимые операции над ними.

Пять переменных состояния предоставляют количество операций, связанных с событиями (но не количество операторов, выполняемых событиями; см. Раздел 27.8, «Ограничения хранимых программ»). Это:

  • 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%';.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/events-privileges.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API