По характеру выполняемых действий можно дать следующую классификацию триггеров:
· триггеры запрещающего действия, которые отменяют все результаты выполнения активизирующего оператора, если оно привело к появлению некорректных данных;
· триггеры корректирующего действия, которые исправляют неправильные данные или, дополняя активизирующую операцию, вносят некоторые сопутствующие изменения в другие таблицы базы данных;
· триггеры смешанного действия, включающие в себя как запрет, так и корректировку; конкретный результат работы такого триггера определяется условиями.
2.4. Создание триггера
Для создания DML-триггера используется команда createtrigger, имеющая следующий синтаксис:
createtrigger имя_триггера
on таблица | представление
for [{after | instead of}]
[delete] [,] [insert] [,] [update]
as
тело_триггера
Триггер может быть создан только в текущей базе данных и, следовательно, привязан к таблице или представлению текущей базы данных.
После ключевого слова for в операторе createtrigger указывается тип триггера (по умолчанию – after). Что касается ключевых слов insert, delete и update, то одно из них должно стоять обязательно – иначе неясно, на какое действие будет следовать реакция.
Тело триггера – это в самом общем виде не что иное, как последовательность SQL-вызовов по сопутствующей обработке данных. Пример создания триггера будет рассмотрен далее.
2.5. Модификация и удаление триггеров
Чтобы обновить код триггера, можно воспользоваться командой altertrigger, общий синтаксис которой практически идентичен синтаксису createtrigger:
altertrigger имя_триггера
on таблица | представление
{for [{after | instead of}]
[delete] [,] [insert] [,] [update]
as
тело_триггера
}
Смысл параметров ясен из пункта 2.2. Модифицируя триггер, СУБД просто обновляет его код в одной из системных таблиц.
Для удаления триггера используется команда droptrigger, с единственным параметром – именем триггера. Одним вызовом можно удалить и сразу несколько триггеров, перечислив их через запятую.
2.6. Разрешение/запрещение действия триггера
В команде altertable имеется секция {enable | disable} trigger, которая разрешает (enable) или запрещает (disable) действие всех (all) или перечисленных (имя_триггера [,…n]) триггеров, привязанных к данной таблице. Сами триггеры из БД не удаляются, но перестают реагировать на действия пользователя до тех пор, пока снова не будут разрешены.
2.7. Использование таблиц inserted и deleted
В теле триггера можно выполнять анализ изменений, сделанных в связанной таблице и вызвавших его активизацию. Для этого ему должна быть доступна информация о состоянии измененных строк связанной таблицы до триггерного события и после него. С этой целью в триггерах используются псевдотаблицы.
В SQL Server для каждого триггера создается своя пара псевдотаблиц, имеющих имена deleted и inserted. Они доступны только для чтения, индивидуальны для каждого триггера и содержат наборы изменяемых строк связанной таблицы соответственно до изменения и после него. Содержимое таблиц inserted и deleted зависит от триггерного события (табл. 2).
Таблица 2
Активизирующий оператор (тип триггера) |
Содержимое таблиц |
|
inserted |
deleted |
|
insert |
Строки, вставляемые пользователем |
Пусто |
delete |
Пусто |
Строки, удаляемые пользователем. |
update |
Модифицируемые строки после обновления |
Модифицируемые строки до обновления |
Из псевдотаблиц можно осуществлять выборку, как из обычных таблиц или представлений БД.
2.8. Рекомендации по реализации требований целостности с помощью триггеров
Программирование триггеров связано с решением следующих вопросов:
· сколько нужно триггеров, чтобы требование целостности было полностью реализовано;
· с какими таблицами должны быть связаны триггеры;
· какие события должны приводить к их срабатыванию;
· какие действия должны выполняться в триггерах.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.