Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Инструкции триггеров DML используют две особые таблицы: deleted (удаленные значения) и inserted (вставленные значения). SQL Server 2005 автоматически создает и управляет ими.




Эти временные таблицы, находящиеся в оперативной памяти, используются для проверки результатов изменений данных и для установки условий срабатывания триггеров DML. Нельзя в этих таблицах изменять данные напрямую или выполнять над ними операции языка DDL, например инструкцию CREATE INDEX.

В триггерах DML таблицы inserted и deleted в основном используются для выполнения следующих операций.

· Расширение ссылочной целостности между таблицами.

· Вставка или обновление данных в базовых таблицах соответствующего представления.

· Проверка на ошибки и принятие соответствующих мер в связи с появлением ошибок.

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

 

В таблице deleted находятся копии строк, с которыми работали инструкции DELETE или UPDATE. При выполнении инструкции DELETE или UPDATE происходит удаление строк из таблицы триггера и их перенос в таблицу deleted.

В таблице inserted находятся копии строк, с которыми работали инструкции INSERT или UPDATE. При выполнении транзакции вставки или обновления происходит одновременное добавление строк в таблицу триггера и в таблицу inserted. Строки таблицы inserted являются копиями новых строк таблицы триггера.

Транзакция обновления аналогична выполнению операции удаления с последующим выполнением операции вставки; сначала старые строки копируются в таблицу deleted, а затем новые строки копируются в таблицу триггера и в таблицу inserted.

 

Пример использования таблицы deleted в триггере для выполнения бизнес-правил:

Создать триггер для обработки операции удаления записи из таблицы Сделка:

DELETE FROM Сделка WHERE КодСделки=4

Для товара, код которого указан при удалении записи, необходимо откорректировать его остаток на складе. Триггер обрабатывает только одну удаляемую запись.

CREATE TRIGGER Триггер_del

ON Сделка FOR DELETE

AS

IF @@ROWCOUNT=1 -- удалена одна запись

BEGIN

DECLARE @y INT,@x INT

--определяется код и количество товара из

--удаленной из таблицы Сделка записи

SELECT @y=КодТовара, @x=Количество

FROM deleted

--в таблице Склад корректируется количество товара

UPDATE Склад

SET Остаток=Остаток-@x

WHERE КодТовара=@y

END

 

Пример использования таблицы inserted в триггере для выполнения бизнес-правил:

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

Команда вставки записи в таблицу Сделка:

INSERT INTO Сделка

VALUES (3,1,-299,'01/08/2002')

 

Создаваемый триггер должен отреагировать на ее выполнение следующим образом: необходимо отменить команду, если в таблице Склад величина остатка товара оказалась меньше продаваемого количества товара с введенным кодом (в примере код товара=3).

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

CREATE TRIGGER Триггер_ins

ON Сделка FOR INSERT

AS

IF @@ROWCOUNT=1--Возвращает число строк, затронутых при выполнении последней инструкции.

BEGIN

IF NOT EXISTS (SELECT *

FROM inserted

WHERE -inserted.количество<= (SELECT

Склад.Остаток

FROM Склад,Сделка

WHERE Склад.КодТовара=

Сделка.КодТовара))

BEGIN

ROLLBACK TRAN

PRINT

'Отмена поставки: товара на складе нет'

END

END

 

Пример: поддержка ссылочной целостности для таблиц employee и works_on (если в таблице inserted номер служащего (emp_no) не совпадает с номером служащего в таблице employee, то изменение не выполняется – не может быть вставлен служащий, номер которого не существует).

USE sample;

GO

CREATE TRIGGER workson_integrity

ON works_on AFTER INSERT, UPDATE

AS

IF UPDATE(emp_no)

BEGIN IF (SELECT employee.emp_no

FROM employee, inserted WHERE employee.emp_no = inserted.emp_no) IS NULL

BEGIN

ROLLBACK TRANSACTION

PRINT 'No insertion/modification of the row'

END

ELSE PRINT 'The row inserted/modified'

END

 


[1] @@VERSION - Возвращает информацию о версии, архитектуре процессора, дате сборки и операционной системе текущего экземпляра SQL Server.

 

[2] COALESCE - возвращает первое выражение из списка аргументов, не равное NULL.

Синтаксис:

COALESCE ( expression [, ...n ] )

 

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...