Инструкции триггеров DML используют две особые таблицы: deleted (удаленные значения) и inserted (вставленные значения). SQL Server 2005 автоматически создает и управляет ими.
⇐ ПредыдущаяСтр 24 из 24 Эти временные таблицы, находящиеся в оперативной памяти, используются для проверки результатов изменений данных и для установки условий срабатывания триггеров 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 'Отмена поставки: товара на складе нет' 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 ] )
Читайте также: E-mail addresses and servers Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|