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

13.1.15. CREATE TRIGGER Синтаксис

CREATE    [DEFINER = { user | CURRENT_USER }]    TRIGGER trigger_name    trigger_time trigger_event    ON tbl_name FOR EACH ROW    trigger_bodytrigger_time: { BEFORE | AFTER }trigger_event: { INSERT | UPDATE | DELETE }

Этот оператор создает новый триггер. Триггер является именованным объектом базы данных, который связывается с таблицей, и это активируется, когда определенное событие имеет место для таблицы. Триггер становится связанным с названной таблицей tbl_name, который должен обратиться к постоянной таблице. Невозможно связать триггер с a TEMPORARY таблица или представление.

CREATE TRIGGER требует TRIGGER полномочие для таблицы связалось с триггером. Оператор мог бы также потребовать SUPER полномочие, в зависимости от DEFINER значение, как описано позже в этом разделе. Если двоичное журналирование включается, CREATE TRIGGER мог бы потребовать SUPER полномочие, как описано в Разделе 18.7, "Двоичное Журналирование Сохраненных Программ".

DEFINER пункт определяет контекст защиты, который будет использоваться, проверяя права доступа в триггерное время активации. См. позже в этом разделе для получения дополнительной информации.

trigger_time триггерное время действия. Это может быть BEFORE или AFTER указать, что триггер активируется прежде или после каждой строки, которая будет изменена.

trigger_event указывает на вид работы, которая активирует триггер. Они trigger_event значения разрешаются:

Важно понять что trigger_event не представляет литеральный тип SQL-оператора, который активирует триггер так, поскольку это представляет тип табличной работы. Например, INSERT триггер активируется не только INSERT операторы, но также и LOAD DATA операторы, потому что оба оператора вставляют строки в таблицу.

Потенциально запутывающий пример этого INSERT INTO ... ON DUPLICATE KEY UPDATE ... синтаксис: a BEFORE INSERT триггер активируется для каждой строки, сопровождаемой любым AFTER INSERT триггер или оба BEFORE UPDATE и AFTER UPDATE триггеры, в зависимости от того, был ли двойной ключ для строки.

Отметить

Каскадные действия внешнего ключа не активируют триггеры.

Не может быть двух триггеров для данной таблицы, у которых есть то же самое триггерное время действия и событие. Например, Вы не можете иметь два BEFORE UPDATE триггеры для таблицы. Но у Вас может быть a BEFORE UPDATE и a BEFORE INSERT триггер, или a BEFORE UPDATE и AFTER UPDATE триггер.

trigger_body оператор, чтобы выполниться, когда триггер активируется. Если Вы хотите выполнить многократные операторы, используйте BEGIN ... END конструкция составного оператора. Это также позволяет Вам использовать те же самые операторы, которые допустимы в пределах сохраненных подпрограмм. См. Раздел 13.6.1,"BEGIN ... END Синтаксис составного оператора". Некоторые операторы не разрешаются в триггерах; см. Раздел D.1, "Ограничения на Сохраненные Программы".

Можно обратиться к столбцам в подчиненной таблице (таблица, связанная с триггером) при использовании псевдонимов OLD и NEW. OLD.col_name обращается к столбцу существующей строки прежде, чем это будет обновлено или удалено. NEW.col_name обращается к столбцу новой строки, которая будет вставлена или существующая строка после того, как он обновляется.

MySQL хранит sql_mode системная переменная, устанавливающая в действительности, когда триггер создается, и всегда выполняет триггер с этой установкой в силе, независимо от текущего режима SQL сервера, когда триггер начинает выполняться.

DEFINER пункт определяет учетную запись MySQL, которая будет использоваться, проверяя права доступа в триггерное время активации. Если a user значение дается, это должна быть учетная запись MySQL, определенная как 'user_name'@'host_name' (тот же самый формат, используемый в GRANT оператор), CURRENT_USER, или CURRENT_USER(). Значение по умолчанию DEFINER значение является пользователем, который выполняется CREATE TRIGGER оператор. Это - то же самое как определение DEFINER = CURRENT_USER явно.

Если Вы определяете DEFINER пункт, эти правила определяют допустимое DEFINER пользовательские значения:

MySQL берет DEFINER пользователь во внимание, проверяя триггерные полномочия следующим образом:

Для получения дополнительной информации о триггерной безопасности, см. Раздел 18.6, "Управление доступом для Сохраненных Программ и Представления".

В пределах триггера, CURRENT_USER() функционируйте возвращает учетную запись, используемую, чтобы проверить полномочия в триггерное время активации. Это DEFINER пользователь, не пользователь, чьи действия, вызванные триггер, который будет активирован. Для получения информации о пользователе, контролирующем в пределах триггеров, см. Раздел 6.3.12, "основанный на SQL MySQL Account Activity Auditing".

Если Вы используете LOCK TABLES чтобы заблокировать таблицу, у которой есть триггеры, таблицы, используемые в пределах триггера, также блокируются, как описано в Разделе 13.3.5.2,"LOCK TABLES и Триггеры".

Для дополнительного обсуждения триггерного использования см. Раздел 18.3.1, "Триггерный Синтаксис и Примеры".