Введение в дисциплину «Безопасность систем баз данных». Теоретические основы построения реляционных баз данных. Верификация баз данных и проведение аудита в СБД. Распределенные базы данных, страница 42

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

Второе отличие заключается в принципе функционирования триггера. Триггерное событие и все последующие действия, выполняемые триггером, представляют собой единую транзакцию. Фиксация этой транзакции означает фиксацию изменений, сделанных активизирующим оператором (в связанной таблице) и триггером. В случае отката транзакции отменяются все модификации, сделанные как триггером, так и активизирующим оператором.

Классификация триггеров

Общепринятая классификация проводится по трем признакам: тип триггерного события, относительный момент времени активизации триггера и уровень детализации (табл. 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