Spec-Zone .ru
спецификации, руководства, описания, API
|
CREATE [DEFINER = {user
| CURRENT_USER }] TRIGGERtrigger_name
trigger_time
trigger_event
ONtbl_name
FOR EACH ROWtrigger_body
trigger_time
: { BEFORE | AFTER }trigger_event
: { INSERT | UPDATE | DELETE }
Этот оператор создает новый триггер. Триггер является именованным объектом базы данных, который связывается с
таблицей, и это активируется, когда определенное событие имеет место для таблицы. Триггер становится связанным с
названной таблицей tbl_name
, который должен обратиться к постоянной
таблице. Невозможно связать триггер с a TEMPORARY
таблица или представление.
CREATE TRIGGER
требует TRIGGER
полномочие для таблицы связалось с триггером. Оператор мог бы также
потребовать SUPER
полномочие, в
зависимости от DEFINER
значение, как описано позже в этом разделе. Если двоичное
журналирование включается, CREATE TRIGGER
мог бы потребовать SUPER
полномочие, как описано в Разделе 19.7, "Двоичное
Журналирование Сохраненных Программ".
DEFINER
пункт определяет контекст защиты, который будет использоваться, проверяя
права доступа в триггерное время активации. См. позже в этом разделе для получения дополнительной информации.
trigger_time
триггерное время действия. Это может быть BEFORE
или AFTER
указать, что триггер активируется
прежде или после каждой строки, которая будет изменена.
trigger_event
указывает на вид работы, которая активирует триггер. Они
trigger_event
значения разрешаются:
INSERT
: Триггер активируется всякий раз, когда новая строка вставляется в
таблицу; например, через INSERT
, LOAD DATA
, и REPLACE
операторы.
UPDATE
: Триггер активируется всякий раз, когда строка изменяется;
например, через UPDATE
операторы.
DELETE
: Триггер активируется всякий раз, когда строка удаляется из
таблицы; например, через DELETE
и REPLACE
операторы. DROP TABLE
и TRUNCATE TABLE
операторы на таблице не активируют этот триггер, потому что они не используют DELETE
.
Отбрасывание раздела не активируется DELETE
триггеры, также.
Важно понять что 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
Синтаксис составного оператора". Некоторые
операторы не разрешаются в триггерах; см. Раздел E.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
пользовательские значения:
Если Вы не имеете SUPER
полномочие, разрешенное единственное user
значение является Вашей собственной учетной записью, или определенной буквально или при использовании CURRENT_USER
. Невозможно установить устройство определения в
некоторую другую учетную запись.
Если Вы имеете SUPER
полномочие, можно определить любое синтаксически допустимое имя
учетной записи. Если учетная запись фактически не существует, предупреждение сгенерировано.
Хотя возможно создать триггер с несуществующим DEFINER
учетная запись, это не хорошая идея для таких триггеров, которые будут активированы, пока учетная запись
фактически не существует. Иначе, поведение относительно проверки полномочия неопределено.
MySQL берет DEFINER
пользователь во внимание, проверяя триггерные полномочия
следующим образом:
В CREATE
TRIGGER
время, пользователь, который делает заявление, должно иметь TRIGGER
полномочие.
В триггерное время активации полномочия проверяются по DEFINER
пользователь. У этого пользователя должны быть эти полномочия:
TRIGGER
полномочие.
SELECT
полномочие для подчиненной таблицы, если ссылки на столбцы таблицы происходят, используя
OLD.
или
col_name
NEW.
в
триггерном определении. col_name
UPDATE
полномочие для подчиненной таблицы, если столбцы таблицы являются целями SET NEW.
присвоения в триггерном
определении. col_name
= value
Независимо от того, что другие полномочия обычно требуются для операторов, выполняемых триггером.
Для получения дополнительной информации о триггерной безопасности, см. Раздел 19.6, "Управление доступом для Сохраненных Программ и Представления".
В пределах триггера, CURRENT_USER()
функционируйте возвращает учетную запись, используемую, чтобы проверить полномочия в триггерное время активации.
Это DEFINER
пользователь, не пользователь, чьи действия, вызванные триггер, который
будет активирован. Для получения информации о пользователе, контролирующем в пределах триггеров, см. Раздел 6.3.12, "основанный на SQL MySQL
Account Activity Auditing".
Если Вы используете LOCK
TABLES
чтобы заблокировать таблицу, у которой есть триггеры, таблицы, используемые в пределах
триггера, также блокируются, как описано в Разделе 13.3.5.2,"LOCK TABLES
и Триггеры".
Для дополнительного обсуждения триггерного использования см. Раздел 19.3.1, "Триггерный Синтаксис и Примеры".