СОЗДАНИЕ ТРИГГЕРА
Синтаксис
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 поддерживает атомарные 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)
См. также
© 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/