Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ КП ИОСУ 2015.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

10. Триггеры

Триггер – это откомпилированная SQL-процедура, исполнение которой обусловлено наступлением определенных событий внутри реляционной базы данных. Триггер представляет собой специальный тип хранимых процедур, запускаемых сервером автоматически при попытке изменения данных в таблицах, с которыми триггеры связаны. Каждый триггер привязывается к конкретной таблице.

В отличие от обычной подпрограммы, триггер выполняется неявно в каждом случае возникновения триггерного события, к тому же он не имеет аргументов.

Основной формат команды создания или изменения триггера:

CREATE | ALTER} TRIGGER имя_триггера

ON {имя_таблицы | имя_представления }

{ { FOR | AFTER | INSTEAD OF }

{ [ DELETE] [,] [ INSERT] [,] [ UPDATE] }

AS

sql_оператор [...n] }

Триггерные события состоят из вставки (INSERT), удаления (DELETE) и обновления (UPDATE) строк в таблице.

Параметры AFTER и INSTEAD OF, определяют поведение триггеров:

AFTER - триггер выполняется после успешного выполнения вызвавших его команд.

INSTEAD OF - Триггер вызывается вместо выполнения команд.

При выполнении команд добавления, изменения и удаления записей сервер создает две специальные таблицы: inserted и deleted. В них содержатся списки строк, которые будут вставлены или удалены по завершении транзакции. Структура таблиц inserted и deleted идентична структуре таблиц, для которых определяется триггер. Для каждого триггера создается свой комплект таблиц inserted и deleted, поэтому никакой другой триггер не сможет получить к ним доступ. В зависимости от типа операции, вызвавшей выполнение триггера, содержимое таблиц inserted и deleted может быть разным:

команда INSERT – в таблице inserted содержатся все строки, которые пользователь пытается вставить в таблицу; в таблице deleted не будет ни одной строки; после завершения триггера все строки из таблицы inserted переместятся в исходную таблицу;

команда DELETE – в таблице deleted будут содержаться все строки, которые пользователь попытается удалить; триггер может проверить каждую строку и определить, разрешено ли ее удаление; в таблице inserted не окажется ни одной строки;

команда UPDATE – при ее выполнении в таблице deleted находятся старые значения строк, которые будут удалены при успешном завершении триггера. Новые значения строк содержатся в таблице inserted. Эти строки добавятся в исходную таблицу после успешного выполнения триггера.

Для получения информации о количестве строк, которое будет изменено при успешном завершении триггера, можно использовать функцию @@ROWCOUNT; она возвращает количество строк, обработанных последней командой. Следует подчеркнуть, что триггер запускается не при попытке изменить конкретную строку, а в момент выполнения команды изменения. Одна такая команда воздействует на множество строк, поэтому триггер должен обрабатывать все эти строки.

Если при создании базы данных описаны взаимосвязи таблиц (схема, ссылки), основанные на механизме внешних ключей. То такие взаимосвязи имеют приоритет перед триггером и триггер не выполняется.

10.1. Триггер, предупреждающий, что перед изменением реквизитов заказчика, необходимо вывести даты договоров, заключенных с этим заказчиком.

CREATE TRIGGER izmenzak ON zakazchik

INSTEAD OF UPDATE

AS

IF @@ROWCOUNT=1

BEGIN

DECLARE @x SMALLINT

SELECT @x=d.zak_kod FROM zakazchik a, deleted d WHERE a.zak_kod=d.zak_kod

IF EXISTS (SELECT dog_data FROM dogovor WHERE zak_kod=@x)

BEGIN

PRINT 'Внимание имеются договоры с этим заказчиком!'

SELECT dog_data AS

'дата договора', dog_nom AS

'номер договора' FROM dogovor WHERE zak_kod=@x

END

END