Spec-Zone .ru
спецификации, руководства, описания, API

19.4.6. Планировщик События и MySQL Privileges

Чтобы включить или отключить выполнение запланированных событий, необходимо установить значение глобальной переменной event_scheduler системная переменная. Это требует SUPER полномочие.

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; pleaseconsult 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());

Пользователь ожидает в течение приблизительно одной минуты, и затем выполняет a SELECT * FROM mytable; запрос, ожидая видеть несколько новых строк в таблице. Вместо этого таблица пуста. Так как пользователь не имеет INSERT полномочие для рассматриваемой таблицы, событие не имеет никакого эффекта.

Если Вы осматриваете журнал ошибок MySQL (hostname.err), можно видеть, что событие выполняется, но действие, которым оно пытается выполнить сбои, как обозначено RetCode=0:

060209 22:39:44 [Note]     EVEX EXECUTING event newdb.e [EXPR:10]060209 22:39:44 [Note]     EVEX EXECUTED event newdb.e  [EXPR:10]. RetCode=0060209 22:39:54 [Note]     EVEX EXECUTING event newdb.e [EXPR:10]060209 22:39:54 [Note]     EVEX EXECUTED event newdb.e  [EXPR:10]. RetCode=0060209 22:40:04 [Note]     EVEX EXECUTING event newdb.e [EXPR:10]060209 22:40:04 [Note]     EVEX EXECUTED event newdb.e  [EXPR:10]. RetCode=0

Так как у этого пользователя очень вероятно нет доступа к журналу ошибок, возможно проверить, допустим ли оператор действия события, выполняя это непосредственно:

mysql> INSERT INTO myschema.mytable VALUES
        (UNIX_TIMESTAMP());ERROR 1142 (42000): INSERT command denied to user'jon'@'ghidora' for table 'mytable'

Контроль INFORMATION_SCHEMA.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: SQLEVENT_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 сделал любое из этих заявлений:

Можно проверить, что это - истина, исследуя mysql.event таблица (обсужденный позже в этом разделе) или INFORMATION_SCHEMA.EVENTS таблица (см. Раздел 20.7," INFORMATION_SCHEMA EVENTS Таблица") прежде и после издания a DROP USER или RENAME USER оператор.

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

DELETE FROM mysql.event    WHERE db = 'myschema'      AND definer = 'jon@ghidora'      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 операторы выполняют необходимые операции на них.

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

Можно просмотреть текущую стоимость для всех них когда-то, выполняя оператор SHOW STATUS LIKE '%event%';.