Spec-Zone .ru
спецификации, руководства, описания, API
|
CREATE [DEFINER = {user
| CURRENT_USER }] EVENT [IF NOT EXISTS]event_name
ON SCHEDULEschedule
[ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'comment
'] DOevent_body
;schedule
: ATtimestamp
[+ INTERVALinterval
] ... | EVERYinterval
[STARTStimestamp
[+ INTERVALinterval
] ...] [ENDStimestamp
[+ INTERVALinterval
] ...]interval
:quantity
{YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
Этот оператор создает и планирует новое событие. Событие не будет работать, если Планировщик События не будет включен. Для получения информации о проверке состояния Планировщика События и включении этому в случае необходимости, см. Раздел 19.4.2, "Конфигурация Планировщика События".
CREATE
EVENT
требует EVENT
полномочие для схемы, в которой должно быть создано событие. Это могло бы также потребовать SUPER
полномочие, в зависимости от DEFINER
значение, как описано позже в этом разделе.
Минимальные требования для допустимого CREATE
EVENT
оператор следующие:
Ключевые слова CREATE
EVENT
плюс имя события, которое однозначно определяет событие в схеме базы данных.
ON SCHEDULE
пункт, который определяет, когда и как
часто событие выполняется.
A DO
пункт, который содержит SQL-оператор, который будет выполняться
событием.
Это - пример минимального CREATE EVENT
оператор:
CREATE EVENT myevent ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO UPDATE myschema.mytable SET mycol = mycol + 1;
Предыдущий оператор создает названное событие myevent
. Это событие выполняется
однажды — один час после его создания — выполняя SQL-оператор, который постепенно увеличивает значение myschema.mytable
таблица mycol
столбец 1.
event_name
должен быть допустимый идентификатор MySQL с максимальной
длиной 64 символов. Имена события не являются чувствительными к регистру, таким образом, у Вас не может быть
двух названных событий myevent
и MyEvent
в той же
самой схеме. Вообще, управляющие имена события правил являются тем же самым как теми для имен сохраненных
подпрограмм. См. Раздел
9.2, "Имена объектов Схемы".
Событие связывается со схемой. Если никакая схема не обозначается как часть event_name
,
значение по умолчанию (ток) схема принимается. Чтобы создать событие в определенной схеме, квалифицируйте имя
события с использованием схемы
синтаксис. schema_name
.event_name
DEFINER
пункт определяет учетную запись MySQL, которая будет использоваться,
проверяя права доступа во время выполнения события. Если a user
значение дается, это должна быть учетная запись MySQL, определенная как '
(тот же самый формат, используемый в user_name
'@'host_name
'GRANT
оператор), CURRENT_USER
, или CURRENT_USER()
. Значение по умолчанию DEFINER
значение является пользователем, который выполняется CREATE EVENT
оператор. Это - то же самое как определение DEFINER = CURRENT_USER
явно.
Если Вы определяете DEFINER
пункт, эти правила определяют допустимое DEFINER
пользовательские значения:
Если Вы не имеете SUPER
полномочие, разрешенное единственное user
значение является Вашей собственной учетной записью, или определенной буквально или при использовании CURRENT_USER
. Невозможно установить устройство определения в
некоторую другую учетную запись.
Если Вы имеете SUPER
полномочие, можно определить любое синтаксически допустимое имя
учетной записи. Если учетная запись фактически не существует, предупреждение сгенерировано.
Хотя возможно создать событие с несуществующим DEFINER
учетная запись, ошибка происходит во время выполнения события, если учетная запись не существует.
Для получения дополнительной информации о безопасности события, см. Раздел 19.6, "Управление доступом для Сохраненных Программ и Представления".
В пределах события, CURRENT_USER()
функционируйте возвращает учетную запись, используемую, чтобы проверить полномочия во время выполнения события,
которое является DEFINER
пользователь. Для получения информации о пользователе,
контролирующем в пределах событий, см. Раздел
6.3.12, "основанный на SQL MySQL Account Activity Auditing".
IF NOT EXISTS
имеет то же самое значение для CREATE EVENT
что касается CREATE TABLE
: Если событие называют event_name
уже существует в той же самой схеме, никакие меры не
предпринимаются, и никакие ошибочные результаты. (Однако, предупреждение сгенерировано в таких случаях.)
ON SCHEDULE
пункт определяет когда, как часто, и как долго event_body
определенный для повторений события. Этот пункт принимает
одну из двух форм:
AT
используется для одноразового события. Это определяет, что событие выполняется только один раз в дате и
время, данное timestamp
timestamp
, который должен включать и дату и
время, или должен быть выражением, которое решает к значению datetime. Можно использовать значение
любого DATETIME
или TIMESTAMP
введите с этой целью. Если дата является в прошлом
предупреждением, происходит, как показано здесь:
mysql>SELECT NOW();
+---------------------+| NOW() |+---------------------+| 2006-02-10 23:59:01 |+---------------------+1 row in set (0.04 sec)mysql>CREATE EVENT e_totals
->ON SCHEDULE AT '2006-02-10 23:59:00'
->DO INSERT INTO test.totals VALUES (NOW());
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql>SHOW WARNINGS\G
*************************** 1. row *************************** Level: Note Code: 1588Message: Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.
CREATE EVENT
операторы, которые самостоятельно недопустимы — по любой
причине — перестали работать с ошибкой.
Можно использовать CURRENT_TIMESTAMP
определить текущую дату и время. В таком случае
действует событие, как только это создается.
Чтобы создать событие, которое происходит в некоторый момент в будущем относительно текущей даты и
время — такое как выраженное фразой "три недели с этого времени"
— можно использовать дополнительный пункт + INTERVAL
. interval
interval
часть состоит из двух частей, количества и единицы времени, и следует за теми же самыми правилами
синтаксиса, которые управляют интервалами, используемыми в DATE_ADD()
функция (см. Раздел
12.7, "Дата и Функции Времени". Ключевые слова модулей являются также тем же
самым, за исключением того, что невозможно использовать модули, включающие микросекунды, определяя
событие. С некоторыми типами интервала могут использоваться сложные единицы измерения времени.
Например, "две минуты и десять секунд" могут быть выражены как + INTERVAL '2:10' MINUTE_SECOND
.
Можно также объединить интервалы. Например, AT CURRENT_TIMESTAMP + INTERVAL 3
WEEK + INTERVAL 2 DAY
эквивалентно "трем неделям и двум дням с этого времени".
Каждая часть такого пункта должна начаться + INTERVAL
.
Чтобы повторить действия в равном интервале, используйте EVERY
пункт. EVERY
ключевое слово сопровождается interval
как описано в предыдущем обсуждении AT
ключевое слово. (+ INTERVAL
не используется с EVERY
.) Например, EVERY 6 WEEK
означает
"каждые шесть недель".
Хотя + INTERVAL
пункты не разрешаются в EVERY
пункт, можно использовать те же самые сложные единицы измерения
времени, разрешенные в a + INTERVAL
.
EVERY
пункт может содержать дополнительное STARTS
пункт. STARTS
сопровождается a timestamp
значение, которое указывает, когда действие
должно начать повторяться, и может также использовать + INTERVAL
определить количество времени "с этого времени". Например, interval
EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK
означает
"каждые три месяца, начиная одну неделю с этого времени".
Точно так же можно выразить "каждые две недели, начиная шесть часов и пятнадцать минут с этого времени"
как EVERY 2 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL '6:15' HOUR_MINUTE
.
Не определение STARTS
то же самое как использование STARTS CURRENT_TIMESTAMP
— то есть, действие, определенное для
события, начинает повторяться непосредственно после создания события.
EVERY
пункт может содержать дополнительное ENDS
пункт. ENDS
ключевое слово
сопровождается a timestamp
значение, которое говорит
MySQL, когда событие должно прекратить повторяться. Можно также использовать +
INTERVAL
с interval
ENDS
; например, EVERY 12 HOUR STARTS
CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
эквивалентно "каждые двенадцать часов, начиная тридцать минут с этого времени, и заканчивая четыре недели с этого времени".
Не использование ENDS
средства, которые событие продолжает выполнять
неопределенно.
ENDS
поддерживает тот же самый синтаксис для сложных единиц измерения
времени как STARTS
делает.
Можно использовать STARTS
, ENDS
, оба, или
ни один в EVERY
пункт.
Если повторяющееся событие не завершается в пределах его интервала планирования, результатом могут
быть многократные экземпляры события, выполняющегося одновременно. Если это - нежелательный, следует
установить механизм, чтобы предотвратить одновременные экземпляры. Например, Вы могли использовать
GET_LOCK()
функция, или строка или табличная блокировка.
ON SCHEDULE
пункт может использовать выражения, включающие встроенные функции MySQL
и пользовательские переменные, чтобы получить любой из timestamp
или
interval
значения, которые это содержит. Вы не можете использовать
сохраненные функции или определяемые пользователем функции в таких выражениях, и при этом Вы не можете
использовать ссылки на таблицу; однако, можно использовать SELECT FROM DUAL
. Это -
истина для обоих CREATE EVENT
и ALTER
EVENT
операторы. Ссылки на сохраненные функции, определяемые пользователем функции, и таблицы в
таких случаях определенно не разрешаются, и сбой с ошибкой (см. Ошибку #22830).
Времена в ON SCHEDULE
пункт интерпретируется, используя текущий сеанс time_zone
значение. Это становится часовым поясом события; то есть, часовой пояс, который используется для планирования
событий и является в действительности в пределах события, как это выполняется. Эти времена преобразовываются в
UTC и сохранены наряду с часовым поясом события в mysql.event
таблица. Это
позволяет выполнению события продолжиться как определено независимо от любых последующих изменений к часовому
поясу сервера или эффектам летнего времени. Для дополнительной информации о представлении времен события см. Раздел
19.4.4, "Метаданные События". См. также Раздел
13.7.5.19,"SHOW EVENTS
Синтаксис", и Раздел
20.7," INFORMATION_SCHEMA EVENTS
Таблица".
Обычно, как только событие истекло, оно было сразу отброшено. Можно переопределить это поведение, определяя
ON COMPLETION PRESERVE
. Используя ON COMPLETION NOT
PRESERVE
просто делает значение по умолчанию нестойким поведением явный.
Можно создать событие, но препятствовать тому, чтобы оно было активным использованием DISABLE
ключевое слово. Альтернативно, можно использовать ENABLE
сделать явным состояние
значения по умолчанию, которое является активным. Это является самым полезным в соединении с ALTER EVENT
(см. Раздел
13.1.2,"ALTER EVENT
Синтаксис").
Третье значение может также появиться вместо ENABLED
или DISABLED
;
DISABLE ON SLAVE
устанавливается для состояния события на ведомом устройстве
репликации указать, что событие создавалось на ведущем устройстве и тиражировалось к ведомому устройству, но не
выполняется на ведомом устройстве. См. Раздел 16.4.1.11,
"Репликация Вызванных Функций".
Можно предоставить комментарий для события, используя a COMMENT
пункт. comment
может быть любая строка до 64 символов, которые Вы хотите
использовать для того, чтобы описать событие. Текст комментария, будучи строковым литералом, должен быть окружен
кавычками.
DO
пункт
определяет действие, которое переносит событие, и состоит из SQL-оператора. Почти любой допустимый оператор
MySQL, который может использоваться в сохраненной подпрограмме, может также использоваться в качестве оператора
действия для запланированного события. (См. Раздел E.1, "Ограничения
на Сохраненные Программы".) Например, следующее событие e_hourly
удаляет все строки из sessions
таблица однажды в час, где эта таблица является
частью site_activity
схема:
CREATE EVENT e_hourly ON SCHEDULE EVERY 1 HOUR COMMENT 'Clears out sessions table each hour.' DO DELETE FROM site_activity.sessions;
MySQL хранит sql_mode
системная переменная, устанавливающая в действительности, когда событие
создается или изменяется, и всегда выполняет событие с этой установкой в силе, независимо
от текущего режима SQL сервера, когда событие начинает выполняться.
A CREATE EVENT
оператор, который содержит ALTER EVENT
оператор в DO
пункт, кажется, успешно выполняется; однако, когда сервер пытается выполнить
получающееся запланированное событие, сбои выполнения с ошибкой.
Операторы такой как SELECT
или SHOW
это просто возвращается, набор результатов не имеют никакого эффекта
когда использующийся в событии; вывод от них не отправляется MySQL Monitor, и при этом это не сохранено
нигде. Однако, можно использовать операторы такой как SELECT ... INTO
и INSERT INTO ... SELECT
то хранилище результат. (См. следующий пример в
этом разделе для экземпляра последнего.)
Схема, которой принадлежит событие, является схемой значения по умолчанию для ссылок на таблицу в DO
пункт.
Любые ссылки на таблицы в других схемах должны быть квалифицированы с надлежащим именем схемы.
Как с сохраненными подпрограммами, можно использовать синтаксис составного оператора в DO
пункт при использовании BEGIN
и END
ключевые слова, как показано здесь:
delimiter |CREATE EVENT e_daily ON SCHEDULE EVERY 1 DAY COMMENT 'Saves total number of sessions then clears the table each day' DO BEGIN INSERT INTO site_activity.totals (time, total) SELECT CURRENT_TIMESTAMP, COUNT(*) FROM site_activity.sessions; DELETE FROM site_activity.sessions; END |delimiter ;
Этот пример использует delimiter
команда, чтобы изменить разделитель оператора. См.
Раздел 19.1, "Определяя Сохраненные Программы".
Более сложные составные операторы, такие как используемые в сохраненных подпрограммах, возможны в событии. Этот пример использует локальные переменные, обработчик ошибок, и конструкцию управления потоками:
delimiter |CREATE EVENT e ON SCHEDULE EVERY 5 SECOND DO BEGIN DECLARE v INTEGER; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; SET v = 0; WHILE v < 5 DO INSERT INTO t1 VALUES (0); UPDATE t2 SET s1 = s1 + 1; SET v = v + 1; END WHILE; END |delimiter ;
Нет никакого способа передать параметры непосредственно к или от событий; однако, возможно вызвать сохраненную подпрограмму с параметрами в пределах события:
CREATE EVENT e_call_myproc ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY DO CALL myproc(5, 27);
Если устройство определения события имеет SUPER
полномочие, событие может считать и записать глобальные переменные. Поскольку предоставление этого полномочия
влечет за собой потенциал для злоупотребления, экстремальная забота должна быть проявлена при этом.
Обычно, любые операторы, которые допустимы в сохраненных подпрограммах, могут использоваться для операторов действия, выполняемых событиями. Для получения дополнительной информации об операторах, допустимых в пределах сохраненных подпрограмм, см. Раздел 19.2.1, "Сохраненный Стандартный Синтаксис". Можно создать событие как часть сохраненной подпрограммы, но событие не может быть создано другим событием.