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.