Первое существенное отличие триггера от обычной хранимой процедуры состоит в том, что триггер не имеет параметров, не возвращает никаких значений и не вызывается пользователем непосредственно.
Второе отличие заключается в принципе функционирования триггера. Триггерное событие и все последующие действия, выполняемые триггером, представляют собой единую транзакцию. Фиксация этой транзакции означает фиксацию изменений, сделанных активизирующим оператором (в связанной таблице) и триггером. В случае отката транзакции отменяются все модификации, сделанные как триггером, так и активизирующим оператором.
Классификация триггеров
Общепринятая классификация проводится по трем признакам: тип триггерного события, относительный момент времени активизации триггера и уровень детализации (табл. 5.7).
Таблица 5.7 – Классификация триггеров
Признак классификации |
Тип триггера |
Краткая характеристика |
Триггерное событие |
INSERT |
Активизируется при вставке строк в связанную таблицу |
UPDATE |
Активизируется при обновлении строк связанной таблицы |
|
DELETE |
Активизируется при удалении строк из связанной таблицы |
|
Время запуска |
BEFORE |
Запускается до выполнения SQL-оператора, вызывающего триггерное событие |
INSTEAD OF |
Запускается вместо активизирующего оператора |
|
AFTER |
Запускается после выполнения оператора |
|
Уровень детализации |
Строковый |
Активизируется в ответ на изменение каждой строки, на которую влияет активизирующий оператор |
Операторный |
Срабатывает один раз при выполнении активизирующего оператора |
Следует отметить, что типы INSERT, UPDATE и DELETE не взаимоисключают друг друга. Триггер может активизироваться одновременно двумя и даже всеми тремя разновидностями операторов.
Если с таблицей связано множество триггеров, их активизация, а также выполнение вызвавшего их оператора, происходит в следующем порядке.
1. Выполняется операторный триггер BEFORE.
2. Для каждой строки, обрабатываемой оператором:
a) выполняется строковый триггер BEFORE;
б) выполняется активизирующий оператор или триггер INSTEAD OF;
в) выполняется строковый триггер AFTER.
3. Выполняется операторный триггер AFTER.
Что касается SQL Server, типы триггеров в этой СУБД не вполне соответствуют приведенной классификации. В SQL Server нет триггеров BEFORE, а также полностью отсутствует третий тип классификации: все триггеры являются здесь операторными.
Контроль изменений в связанных таблицах
В теле триггера можно выполнять анализ изменений, сделанных в связанной таблице и вызвавших его активизацию. Для этого ему должна быть доступна информация о состоянии измененных строк связанной таблицы до триггерного события и после него. С этой целью в триггерах используются псевдотаблицы.
В SQL Server для каждого триггера создается своя пара псевдотаблиц, имеющих имена deleted и inserted. Они доступны только для чтения, индивидуальны для каждого триггера и содержат наборы изменяемых строк связанной таблицы соответственно до изменения и после него (таблица 5.8).
Таблица 5.8 – Содержимое псевдотаблиц deleted и inserted в зависимости от типа триггерного события
Триггерное событие |
Содержимое таблиц |
|
deleted |
inserted |
|
Вставка |
Пусто |
Добавляемые строки |
Удаление |
Удаляемые строки |
Пусто |
Обновление |
Модифицируемые строки до обновления |
Модифицируемые строки после обновления |
Из псевдотаблиц можно осуществлять выборку, как из обычных таблиц или представлений БД. Однако следует подчеркнуть, что любое обращение к псевдотаблицам выполнимо только из тела триггера. Нетрудно понять и то, что в разных триггерах под одними и теми же именами inserted и deleted выступают совершенно разные таблицы.
DDL-триггеры в Microsoft SQL Server
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.