Spec-Zone.ru › MySQL 8.4

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

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

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_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.3.1, “Синтаксис и примеры триггеров”.

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

Spec-Zone.ru

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