13.1.20 Оператор CREATE TRIGGER
CREATE
[DEFINER = user]
TRIGGER 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 таблицей или представлением.
Имена триггеров существуют в пространстве имён схемы, что означает, что все триггеры должны иметь уникальные имена в рамках одной схемы. Триггеры в разных схемах могут иметь одинаковые имена.
В этом разделе описывается CREATE
TRIGGER синтаксис. Дополнительную информацию можно найти в Разделе 23.3.1, «Синтаксис и примеры триггеров».
CREATE TRIGGER требует TRIGGER привилегии для таблицы, связанной с триггером. Если присутствует DEFINER оператор, требуемые привилегии зависят от значения user, как описано в Разделе 23.6, «Управление доступом к объектам хранилища». Если включён двоичный журнал, CREATE TRIGGER может потребовать SUPER привилегию, как описано в Разделе 23.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. Это также позволяет использовать те же операторы, которые разрешены в хранимых процедурах. См. Раздел 13.6.1, «Составной оператор BEGIN ... END». Некоторые операторы не разрешены в триггерах; см. Раздел 23.8, «Ограничения на хранимые программы».
В теле триггера можно ссылаться на столбцы целевой таблицы (таблицы, связанной с триггером), используя псевдонимы OLD и NEW. OLD. относится к столбцу существующей строки до её обновления или удаления. col_nameNEW. относится к столбцу новой строки, которая должна быть вставлена, или к существующей строке после её обновления.col_name
Триггеры не могут использовать NEW. или использовать col_nameOLD. для ссылки на генерированные столбцы. Сведения о генерированных столбцах см. в Разделе 13.1.18.7, «CREATE TABLE и генерированные столбцы».col_name
MySQL сохраняет значение системной переменной sql_mode, установленное при создании триггера, и всегда выполняет тело триггера с этим значением, независимо от текущего режима SQL-сервера во время выполнения триггера.
DEFINER оператор указывает MySQL-аккаунт, который будет использоваться при проверке привилегий доступа во время активации триггера. Если присутствует DEFINER оператор, значение user должно быть MySQL-аккаунтом, указанным как ', user_name'@'host_name'CURRENT_USER или CURRENT_USER(). Разрешенные значения user зависят от имеющихся привилегий, как описано в Разделе 23.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, а не пользователя, действия которого вызвали активацию триггера. Сведения об аудировании пользователей в рамках триггеров см. в Разделе 6.2.18, «Аудирование активности учётных записей на основе SQL».
Если вы используете LOCK TABLES для блокировки таблицы, которая содержит триггеры, таблицы, используемые внутри триггера, также будут заблокированы, как описано в LOCK TABLES и триггеры.
Для дополнительной информации об использовании триггеров, см. Раздел 23.3.1, «Синтаксис и примеры триггеров».
© 2025 Oracle
Licensed under the GPLv2 License.