Spec-Zone.ru › MySQL 9.2

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_name относится к столбцу существующей строки до ее обновления или удаления. NEW.col_name относится к столбцу новой строки для вставки или существующей строки после ее обновления.

Триггеры не могут использовать NEW.col_name или использовать OLD.col_name для ссылки на сгенерированные столбцы. Подробную информацию о сгенерированных столбцах см. в разделе 15.1.21.8 «CREATE TABLE и сгенерированные столбцы».

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_name или NEW.col_name в теле триггера.

    • Разрешение UPDATE на таблицу-объект, если столбцы таблицы являются объектами назначений SET NEW.col_name = value в теле триггера.

    • Все другие привилегии, обычно необходимые для операторов, выполняемых триггером.

В теле триггера функция CURRENT_USER возвращает учетную запись, используемую для проверки привилегий во время активации триггера. Это пользователь DEFINER, а не пользователь, действия которого вызвали активацию триггера. Подробную информацию о проверке активности пользователей в рамках триггеров см. в разделе 8.2.23 «Проверка активности учетных записей на основе SQL».

END_OF_DOCUMENT_MARKER

Если вы используете LOCK TABLES для блокировки таблицы, которая имеет триггеры, таблицы, используемые внутри триггера, также блокируются, как описано в LOCK TABLES и триггеры.

Для дополнительного обсуждения использования триггеров см. Раздел 27.4.1, «Синтаксис и примеры триггеров».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/create-trigger.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API