Изучение средств обеспечения целостности данных в SQL Server 2005. Реализация алгоритмов поддержания целостности с помощью триггеров (Лабораторная работа № 6), страница 4

По характеру выполняемых действий можно дать следующую классификацию триггеров:

·  триггеры запрещающего действия, которые отменяют все результаты выполнения активизирующего оператора, если оно привело к появлению некорректных данных;

·  триггеры корректирующего действия, которые исправляют неправильные данные или, дополняя активизирующую операцию, вносят некоторые сопутствующие изменения в другие таблицы базы данных;

·  триггеры смешанного действия, включающие в себя как запрет, так и корректировку; конкретный результат работы такого триггера определяется условиями.

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. Рекомендации по реализации требований целостности с помощью триггеров

Программирование триггеров связано с решением следующих вопросов:

·  сколько нужно триггеров, чтобы требование целостности было полностью реализовано;

·  с какими таблицами должны быть связаны триггеры;

·  какие события должны приводить к их срабатыванию;

·  какие действия должны выполняться в триггерах.