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.