15.1.22 Оператор CREATE TRIGGER
CREATE
[DEFINER = user]
TRIGGER [IF NOT EXISTS] trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
Этот оператор создаёт новый триггер. Триггер — это именованный объект базы данных, связанный со столом и активирующийся при возникновении определённого события для стола. Триггер связывается со столом, названным tbl_name, который должен ссылаться на постоянный стол. Вы не можете связать триггер с временным TEMPORARY столом или представлением.
Имена триггеров существуют в пространстве имён схемы, что означает, что все триггеры должны иметь уникальные имена внутри одной схемы. Триггеры в разных схемах могут иметь одинаковые имена.
IF NOT EXISTS предотвращает возникновение ошибки, если в одной схеме уже существует триггер с таким же именем, для того же стола.
В данном разделе описывается синтаксис оператора CREATE
TRIGGER. Для дополнительной информации см. Раздел 27.3.1, «Синтаксис и примеры триггеров».
Использование CREATE TRIGGER требует привилегии TRIGGER для стола, связанного с триггером. Если присутствует DEFINER-оператор, требуемые привилегии зависят от значения user, как описано в Разделе 27.6, «Управление доступом к хранимым объектам». Если включено двоичное протоколирование, использование CREATE TRIGGER может потребовать привилегию SUPER, как описано в Разделе 27.7, «Двоичное протоколирование хранимых программ».
DEFINER-оператор определяет контекст безопасности, который будет использоваться при проверке привилегий доступа во время активации триггера, как описано ниже в этом разделе.
trigger_time — это время действия триггера. Оно может быть BEFORE или AFTER для обозначения активации триггера до или после каждой изменяемой строки.
Проверка базовых значений столбцов выполняется до активации триггера, поэтому вы не можете использовать BEFORE триггеры для преобразования значений, неприемлемых для типа столбца, в допустимые значения.
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 ...: триггер BEFORE INSERT активируется для каждой строки, за которым следует либо триггер AFTER INSERT, либо оба триггера BEFORE UPDATE и AFTER
UPDATE, в зависимости от наличия дублирующего ключа для строки.
Каскадные действия внешних ключей не активируют триггеры.
Возможно определение нескольких триггеров для данного стола, которые имеют одинаковое событие триггера и время действия. Например, для стола можно задать два триггера BEFORE UPDATE. По умолчанию триггеры, имеющие одинаковое событие триггера и время действия, активируются в порядке их создания. Для изменения порядка триггеров укажите trigger_order-оператор, который указывает FOLLOWS или PRECEDES и имя существующего триггера, имеющего тоже событие триггера и время действия. При использовании FOLLOWS новый триггер активируется после существующего. При использовании PRECEDES новый триггер активируется до существующего.
trigger_body — это оператор, который нужно выполнить при активации триггера. Для выполнения нескольких операторов используйте конструкцию составного оператора BEGIN ... END. Это также позволяет использовать те же операторы, что разрешены в хранимых процедурах. См. Раздел 15.6.1, «Составной оператор BEGIN ... END». Некоторые операторы не разрешены в триггерах; см. Раздел 27.8, «Ограничения на хранимые программы».
В теле триггера можно ссылаться на столбцы целевого стола (стола, связанного с триггером), используя псевдонимы OLD и NEW. OLD. ссылается на столбец существующей строки до её обновления или удаления. col_nameNEW. ссылается на столбец новой строки для добавления или существующей строки после её обновления. col_name
Триггеры не могут использовать NEW. или использовать col_nameOLD. для ссылки на сгенерированные столбцы. Для получения информации о сгенерированных столбцах см. Раздел 15.1.20.8, «CREATE TABLE и сгенерированные столбцы». col_name
MySQL сохраняет значение системной переменной sql_mode, действующее при создании триггера, и всегда выполняет тело триггера с этим значением, независимо от текущего режима SQL сервера при начале выполнения триггера.
DEFINER-оператор указывает учётную запись MySQL, которая будет использоваться при проверке привилегий доступа во время активации триггера. Если присутствует DEFINER-оператор, значение user должно быть учётной записью MySQL, указанной как ', user_name'@'host_name'CURRENT_USER или CURRENT_USER(). Разрешённые значения user зависят от имеющихся привилегий, как описано в Разделе 27.6, «Управление доступом к хранимым объектам». Дополнительная информация о безопасности триггеров также находится в этом разделе.
Если DEFINER-оператор опущен, по умолчанию определён пользователем, который выполняет оператор CREATE
TRIGGER. Это эквивалентно явному указанию DEFINER = CURRENT_USER.
MySQL учитывает пользователя DEFINER при проверке привилегий триггера следующим образом:
В момент
CREATE TRIGGERпользователя, выпустившего оператор, должны бытьTRIGGERпривилегии.-
В момент активации триггера привилегии проверяются относительно пользователя
DEFINER. Этот пользователь должен иметь следующие привилегии:TRIGGERпривилегии для целевого стола.SELECTпривилегии для целевого стола, если ссылки на столбцы таблицы происходят с использованиемOLD.илиcol_nameNEW.в теле триггера.col_nameUPDATEпривилегии для целевого стола, если столбцы таблицы являются объектамиSET NEW.-присваиваний в теле триггера.col_name=valueЛюбые другие привилегии, обычно требуемые для операторов, выполняемых триггером.
В теле триггера функция CURRENT_USER возвращает учётную запись, используемую для проверки привилегий во время активации триггера. Это пользователь DEFINER, а не пользователь, действия которого вызвали активацию триггера. Дополнительную информацию об аудировании пользователей внутри триггеров см. в Разделе 8.2.23, «Аудит активности учётных записей на основе SQL».
Если вы используете LOCK TABLES для блокировки таблицы, которая имеет триггеры, то таблицы, используемые внутри триггера, также блокируются, как описано в LOCK TABLES и триггеры.
Для дополнительного обсуждения использования триггеров, см. Раздел 27.3.1, “Синтаксис и примеры триггеров”.
© 2025 Oracle
Licensed under the GPLv2 License.