Триггер – это хранимая процедура, которая начинает работать при наступлении определенного события.
Например, можно создать хранимую процедуру, которая всегда будет срабатывать при удалении записи из транзакционной таблицы. Следовательно, будет автоматически удаляться соответствующий заказчик из таблицы заказчиков при удалении всех его транзакций.
Процедура привязана к базе данных, а триггер привязан к таблице и вызывается по событию только этой таблицы.
Например, запишем инструкции, которые создают таблицу и вызывают триггер при INSERT. Триггер суммирует значения, которые вставлены в столбец «amount» в переменную @sum:
CREATE TRIGGER
Инструкция создания нового триггера:
DEFINER аналогичный процедурному.
trigger_name – название триггера строкового типа.
trigger_time – время действия. Это может быть BEFORE или AFTER, указывающие, что триггер активизируется перед или после указанного события.
trigger_event – вид инструкции, активизирующей триггер. Может принимать следующие значения:
- UPDATE – каждый раз, когда происходит изменение строки. К примеру, через инструкцию UPDATE.
- INSERT – каждый раз, когда в таблицу добавляется новая строка. К примеру, через команды REPLACE, LOAD DATA или INSERT.
- DELETE – каждый раз, когда происходит удаление строки из таблицы. К примеру, через инструкции REPLACE и DELETE. Обратим внимание, что инструкциями TRUNCATE и DROP TABLE относительно таблицы НЕ активизируется триггер, т.к. они не используют DELETE.
Невозможно существование двух триггеров с теми же временем действия и событием для данной таблицы.
Например, невозможно иметь 2 триггера BEFORE INSERT для таблицы. Но возможно иметь BEFORE INSERT и BEFORE UPDATE или AFTER INSERT и BEFORE INSERT.
tbl_name – название таблицы, к которой триггер привязан.
trigger_stmt – инструкция, которая будет выполняться при активации триггера.
Псевдонимы OLD и NEW
С помощью псевдонимов обращаются к данным в разном состоянии.
OLD.colname позволяет обращаться к столбцу существующей строки до ее модификации или удаления.
NEW.colname позволяет обращаться к столбцу новой строки, которая вставится, или же к существующей строке после ее модификации.
Например:
Перед вставкой строки в test1 вставляются новые данные в test2, удаляются из test3 и обновляются в test4.
Существуют ограничения, которые применяются к инструкциям:
- Триггер не может воспользоваться инструкцией CALL для вызова хранимых процедур, возвращающих данные пользователю или применяющих динамический SQL. Данные триггеру процедурам можно возвратить через параметры INOUT или OUT.
- Триггеру нельзя использовать инструкции, неявно или явно начинающие или заканчивающие транзакцию, например, ROLLBACK, COMMIT или START TRANSACTION.
Обрабатываются ошибки в MySQL при выполнении триггеров следующим образом:
- При возникновении проблем с триггером BEFORE операции на соответствующей строке не выполняются.
- Триггер BEFORE активизируется попыткой вставки или изменения строки, независимо от удачной или неудачной попытки.
- Триггер AFTER выполняется только тогда, когда совместно успешно выполняются триггер BEFORE и операция со строкой.
- Ошибка в триггере AFTER или BEFORE вызывает сбой всей инструкции, вызвавшей триггер.
- Сбой инструкции вызывает возврат всех изменений для транзакционных таблиц, которые выполнялись инструкцией. Сбой триггера также вызывает возврат всех изменений, т.к. является причиной сбоя команды в целом. Такой возврат изменений не может быть выполнен для нетранзакционных таблиц, т.е. при операторном сбое любые изменения, которые выполнены до ошибки, остаются без изменений.
DROP TRIGGER
Удаление ранее созданного триггера:
Если имя базы данных не задано, удаляется триггер из базы данных, заданной по умолчанию.
ALTER TRIGGER
Переопределение старого триггера: