Spec-Zone.ru › MySQL 5.7

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

Для включения или отключения выполнения запланированных событий необходимо установить значение глобальной системной переменной event_scheduler. Это требует прав, достаточных для установки глобальных системных переменных. См. Раздел 5.1.8.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;

Вы можете проверить, что это верно, проверив таблицу mysql.event (описанную позже в этом разделе) или таблицу схемы информации EVENTS до и после выполнения команды DROP USER или RENAME USER.

Определения событий хранятся в таблице mysql.event. Чтобы удалить событие, созданное другой учётной записью пользователя, пользователь MySQL root (или другой пользователь с необходимыми правами) может удалить строки из этой таблицы. Например, чтобы удалить событие e_insert, показанное ранее, root может использовать следующую команду:

DELETE FROM mysql.event
    WHERE db = 'myschema'
      AND name = 'e_insert';

Очень важно сопоставить имя события и имя базы данных при удалении строк из таблицы mysql.event. Это связано с тем, что разные события с одинаковым именем могут существовать в разных схемах.

Права пользователей 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 выполняют необходимые операции над ними.

Пять переменных состояния предоставляют подсчет операций, связанных с событиями (но не утверждений, выполняемых событиями; см. Раздел 23.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-5.7-en/events-privileges.html

Spec-Zone.ru

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