Обеспечение целостности данных имеет решающее значение для поддержания точности и согласованности базы данных. Триггеры представляют собой особый вид хранимых процедур, привязанных в таблицам и представлениям и автоматически срабатывающих при добавлении, удалении или изменении данных. Прежде чем реализовывать триггер, следует выяснить, нельзя ли получить аналогичные результаты с использованием ограничений. Триггеры применяются в следующих случаях:
- если требуется реализовать сложные ограничения на данные;
- если необходимо каскадное изменение через связанные таблицы в базе данных;
- если база данных денормализована и требуется способ автоматизированного обновления избыточных (дублирующих) данных в нескольких таблицах;
- если требуется вывод пользовательских сообщений, журналирование проводимых пользователем операций с данными или сложная обработка ошибок.
Для создания триггера используется конструкция следующего вида:
CREATE TRIGGER {имя триггера}
ON {имя таблицы}
FOR {тип события для обработки}
AS
{текст триггера}
При создании триггера следует задать тип события, вызывающего его срабатывание. Типов события три: INSERT, UPDATE, DELETE. Один и тот же триггер может срабатывать на одно, два или все три события. Конструкция AS и следующие за ней команды языка SQL определяют задачу, которую будет выполнять триггер.
При срабатывании триггера на события INSERT, UPDATE или DELETE создается одна или две псевдотаблицы (также известных как логические таблицы). Существует два типа логических таблиц: INSERTED и DELETED. INSERTED создается в результате события добавления или обновления данных. В ней находится набор добавленных или измененных записей. DELETED создается в результате удаления или обновления данных.
В случае удаления данных в ней находятся удаленные записи, а в случае обновления данных в ней находятся обновленные записи в том состоянии, в каком они были до операции обновления. Для определения того, значение какого поля записей было изменено при обновлении данных, используется конструкция IF UPDATE({имя поля}). UPDATE({имя поля}) возвращает TRUE, если поле было изменено, и FALSE в противном случае. Необходимо обратить внимание на тот факт, что при выполнении триггера таблица, для которой был создан триггер, уже содержит добавленные и измененные записи и не содержит удаленные записи.
Для отмены добавления, удаления или изменения данных в триггере необходимо вызвать оператор отката транзакции ROLLBACK TRAN.