Spec-Zone.ru › MySQL 5.7

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

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

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

    • UPDATE привилегию для целевой таблицы, если столбцы таблицы являются объектами 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/create-trigger.html

Spec-Zone.ru

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