15.1.23 Оператор 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.4.1 «Синтаксис и примеры триггеров».
Для использования оператора CREATE TRIGGER необходимо разрешение TRIGGER на связанную таблицу. Если присутствует фрагмент DEFINER, необходимые разрешения зависят от значения user, как описано в разделе 27.7 «Управление доступом к хранимым объектам». Если включен двоичный журналик, оператор CREATE TRIGGER может потребовать разрешение SUPER, как описано в разделе 27.8 «Двоичный журналик хранимых программ».
Фрагмент 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.9 «Ограничения на хранимые программы».
Внутри тела триггера вы можете ссылаться на столбцы таблицы-объекта (таблицы, связанной с триггером), используя псевдонимы OLD и NEW. OLD. относится к столбцу существующей строки до ее обновления или удаления. col_nameNEW. относится к столбцу новой строки для вставки или существующей строки после ее обновления. col_name
Триггеры не могут использовать NEW. или использовать col_nameOLD. для ссылки на сгенерированные столбцы. Подробную информацию о сгенерированных столбцах см. в разделе 15.1.21.8 «CREATE TABLE и сгенерированные столбцы».col_name
MySQL сохраняет значение системной переменной sql_mode, действовавшее при создании триггера, и всегда выполняет тело триггера с этим значением, независимо от текущего режима SQL сервера во время выполнения триггера.
Фрагмент DEFINER указывает учетную запись MySQL, которая используется при проверке разрешений во время активации триггера. Если фрагмент DEFINER присутствует, значение user должно быть учетной записью MySQL, заданной как ', user_name'@'host_name'CURRENT_USER или CURRENT_USER(). Разрешенные значения user зависят от имеющихся у вас привилегий, как описано в разделе 27.7 «Управление доступом к хранимым объектам». Также см. этот раздел для получения дополнительной информации о безопасности триггеров.
Если фрагмент DEFINER опущен, по умолчанию используется пользователь, который выполнил оператор CREATE
TRIGGER. Это то же самое, что явное указание DEFINER = CURRENT_USER.
MySQL учитывает пользователя DEFINER при проверке привилегий триггера следующим образом:
В момент
CREATE TRIGGERпользователь, который выполняет оператор, должен обладать разрешениемTRIGGER.-
В момент активации триггера привилегии проверяются для пользователя
DEFINER. Этот пользователь должен иметь следующие привилегии:Разрешение
TRIGGERна таблицу-объект.Разрешение
SELECTна таблицу-объект, если ссылки на столбцы таблицы происходят с использованиемOLD.илиcol_nameNEW.в теле триггера.col_nameРазрешение
UPDATEна таблицу-объект, если столбцы таблицы являются объектами назначенийSET NEW.в теле триггера.col_name=valueВсе другие привилегии, обычно необходимые для операторов, выполняемых триггером.
В теле триггера функция CURRENT_USER возвращает учетную запись, используемую для проверки привилегий во время активации триггера. Это пользователь DEFINER, а не пользователь, действия которого вызвали активацию триггера. Подробную информацию о проверке активности пользователей в рамках триггеров см. в разделе 8.2.23 «Проверка активности учетных записей на основе SQL».
Если вы используете LOCK TABLES для блокировки таблицы, которая имеет триггеры, таблицы, используемые внутри триггера, также блокируются, как описано в LOCK TABLES и триггеры.
Для дополнительного обсуждения использования триггеров см. Раздел 27.4.1, «Синтаксис и примеры триггеров».
© 2025 Oracle
Licensed under the GPLv2 License.