Spec-Zone.ru › MariaDB

СОЗДАНИЕ ТРИГГЕРА

Синтаксис

CREATE [OR REPLACE]
    [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
    TRIGGER [IF NOT EXISTS] trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW
   [{ FOLLOWS | PRECEDES } other_trigger_name ]
   trigger_stmt;

Описание

Данное утверждение создаёт новый триггер. Триггер — это именованный объект базы данных, связанный со таблицей, который активируется при возникновении определённого события для таблицы. Триггер связывается с таблицей, названной tbl_name, которая должна ссылаться на постоянную таблицу. Вы не можете связать триггер с TEMPORARY таблицей или представлением.

CREATE TRIGGER требует привилегии TRIGGER для таблицы, связанной с триггером.

Вы можете иметь несколько триггеров для одной и той же trigger_time и trigger_event.

Для допустимых идентификаторов, которые можно использовать в качестве имён триггеров, см. Имена идентификаторов.

OR REPLACE

Если используется и триггер уже существует, вместо возврата ошибки, существующий триггер будет удалён и заменён новым определённым триггером.

DEFINER

Оператор DEFINER определяет контекст безопасности, который будет использоваться при проверке привилегий доступа во время активации триггера. Для использования требуется привилегия SUPER или, начиная с MariaDB 10.5.2, привилегия SET USER.

IF NOT EXISTS

Если используется оператор IF NOT EXISTS, триггер будет создан только в том случае, если триггер с таким же именем не существует. Если триггер уже существует, по умолчанию будет возвращено предупреждение.

trigger_time

trigger_time — это время действия триггера. Оно может быть BEFORE или AFTER для обозначения того, что триггер активируется до или после каждого изменяемого ряда.

trigger_event

trigger_event указывает тип оператора, который активирует триггер. trigger_event может быть одним из следующих:

  • INSERT: Триггер активируется всякий раз, когда в таблицу вставляется новая строка; например, с помощью операторов INSERT, LOAD DATA и REPLACE.
  • UPDATE: Триггер активируется всякий раз, когда изменяется строка; например, с помощью операторов UPDATE.
  • DELETE: Триггер активируется всякий раз, когда строка удаляется из таблицы; например, с помощью операторов DELETE и REPLACE. Однако, операторы DROP TABLE и TRUNCATE над таблицей не активируют этот триггер, поскольку они не используют DELETE. Удаление раздела также не активирует триггеры DELETE.

FOLLOWS/PRECEDES other_trigger_name

Опции FOLLOWS other_trigger_name и PRECEDES other_trigger_name были добавлены в MariaDB 10.2.3 в рамках поддержки нескольких триггеров на одно время действия. Этот синтаксис такой же, как у MySQL 5.7, хотя у MySQL 5.7 нет поддержки нескольких триггеров.

FOLLOWS добавляет новый триггер после другого триггера, а PRECEDES добавляет новый триггер до другого триггера. Если ни одна из опций не используется, новый триггер добавляется последним для заданного действия и времени.

FOLLOWS и PRECEDES не хранятся в определении триггера. Однако порядок триггеров гарантированно не изменится со временем. mariadb-dump и другие методы резервного копирования не изменят порядок триггеров. Вы можете проверить порядок триггеров в столбце ACTION_ORDER в таблице INFORMATION_SCHEMA.TRIGGERS.

SELECT trigger_name, action_order FROM information_schema.triggers 
  WHERE event_object_table='t1';

Атомарные DDL

MariaDB, начиная с 10.6.1

MariaDB 10.6.1 поддерживает атомарные DDL и CREATE TRIGGER является атомарным.

Примеры

CREATE DEFINER=`root`@`localhost` TRIGGER increment_animal
  AFTER INSERT ON animals FOR EACH ROW 
   UPDATE animal_count SET animal_count.animals = animal_count.animals+1;

OR REPLACE и IF NOT EXISTS

CREATE DEFINER=`root`@`localhost` TRIGGER increment_animal
  AFTER INSERT ON animals FOR EACH ROW
    UPDATE animal_count SET animal_count.animals = animal_count.animals+1;
ERROR 1359 (HY000): Trigger already exists

CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER increment_animal
  AFTER INSERT ON animals  FOR EACH ROW
    UPDATE animal_count SET animal_count.animals = animal_count.animals+1;
Query OK, 0 rows affected (0.12 sec)

CREATE DEFINER=`root`@`localhost` TRIGGER IF NOT EXISTS increment_animal
  AFTER INSERT ON animals FOR EACH ROW
    UPDATE animal_count SET animal_count.animals = animal_count.animals+1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

SHOW WARNINGS;
+-------+------+------------------------+
| Level | Code | Message                |
+-------+------+------------------------+
| Note  | 1359 | Trigger already exists |
+-------+------+------------------------+
1 row in set (0.00 sec)

См. также

  • Имена идентификаторов
  • Обзор триггеров
  • УДАЛЕНИЕ ТРИГГЕРА
  • Таблица схемы информации TRIGGERS
  • ПОКАЗАТЬ ТРИГГЕРЫ
  • ПОКАЗАТЬ СОЗДАТЬ ТРИГГЕР
  • Ограничения триггеров
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/create-trigger/

Spec-Zone.ru

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