Поддержка триггеров включена, начиная с MySQL 5.0.2. Триггер представляет собой именованный объект базы данных, который связан с таблицей, и будет активизирован, когда произойдет определенное событие для таблицы.
Синтаксис команды создания триггера следующий:
CREATE
[DEFINER = {<пользователь> | CURRENT_USER}]
TRIGGER <имя триггера> <время> <событие>
ON <имя таблицы> FOR EACH ROW <тело триггера>
Триггер становится связанным с <имя таблицы>.
Предложение DEFINER определяет имя пользователя MySQL, которое будет использовать при проверке привилегий доступа в вызове триггера. Значение по умолчанию: пользователь, который выполняет инструкцию CREATE TRIGGER, что равнозначно DEFINER = CURRENT_USER. <пользователь> указывается в формате 'user_name'@'host_name' (как в команде GRANT).
<время> задает время действия. Это может быть BEFORE или AFTER, чтобы указать, что триггер активизируется до или после модификации каждой строки. <событие> указывает вид инструкции, которая активизирует триггер. <событие> может быть одним из следующего:
INSERT: триггер активизируется, когда новая строка вставляется в таблицу. Например, через команды INSERT, LOAD DATA или REPLACE.
UPDATE: триггер активизируется, когда строка изменяется. Например, через инструкцию UPDATE.
DELETE: триггер активизируется, когда строка удаляется из таблицы. Например, через инструкции DELETE и REPLACE. Однако, инструкции DROP TABLE и TRUNCATE относительно таблицы НЕ активизируют триггер, потому что не используют DELETE.
Не может быть двух триггеров для данной таблицы, которые имеют те же самые время действия и событие. Например, не может быть двух триггеров BEFORE UPDATE для таблицы. Но может быть BEFORE UPDATE и BEFORE INSERT или BEFORE UPDATE и AFTER UPDATE.
<тело триггера> задает инструкцию, которая будет выполнена, когда триггер активизируется. Если необходимо выполнить много инструкций, используется операторная конструкция BEGIN ... END.
Обращаться к столбцам в подчиненной таблице можно используя псевдонимы OLD и NEW. OLD.<имя столбца> обращается к столбцу существующей строки прежде, чем она модифицируется или удалится. NEW.<имя столбца> обращается к столбцу новой строки, которая будет вставлена, или же к существующей строке после того, как она модифицируется.
Пример создания триггера:
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0);
DELIMITER |
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
|
DELIMITER ;
Синтаксис удаления триггера:
DROP TRIGGER [<база данных>.]<имя триггера>
Имя базы данных необязательно. Если оно не задано, триггер удаляется из заданной по умолчанию базы данных. Использование этой инструкции требует привилегии SUPER.
Замечание: в настоящее время триггеры не активизируются каскадными действиями внешнего ключа.