CREATE TRIGGER Update_ytd_sales
ON sales
FOR INSERT
AS |
|
SELECT |
* |
FROM |
inserted |
UPDATE |
titles |
SET |
ytd_sales = ytd_sales + qty |
FROM |
inserted |
WHERE |
titles.title_id = inserted.title_id |
GO |
|
Отметим, что мы использовали в операторе UPDATE предложение
FROM источник_для_таблицы (FROM inserted), чтобы указать, что значение qty должно поступать из таблицы inserted. Теперь выполним следующий
оператор INSERT для просмотра результатов из этого триггера:
INSERT INTO sales VALUES(7066, 1, “March 7, 2000”, 100, “Net 30”,
«BU1111») GO
Вы увидите следующие результаты. В первом наборе результатов
показана строка, выбранная из таблицы inserted, и второе сообщение «1 row(s) affected» получено из оператора UPDATE.
Stor_id |
ord_num ord_date |
qty |
payterms title_id |
|
|
|
|
|
|
7066 |
1 |
2000-03-07 00:00:00.000 |
100 Net 30 BU1111 |
|
(1 row(s) affected)
Пример. Создадим триггер, который будет удалять строки из таблиц sales, roysched и titleauthor базы данных pubs, когда соответствующая строка удаляется из таблицы titles. Мы будем использовать таблицу deleted, чтобы указывать, какие строки нужно удалить из связанных таблиц. Чтобы этот
триггер мог работать, нам нужно было бы удалить ограничения FOREIGN KEY из таблиц.
CREATE TRIGGER Delete_Title
ON titles
FOR DELETE
AS |
|
DELETE |
sales |
FROM |
sales, deleted |
WHERE |
sales.title_id = deleted.title_id |
"Deleted from sales" |
|
DELETE |
roysched |
FROM |
roysched, deleted |
WHERE |
roysched.title_id = deleted.title_id |
"Deleted from roysched" |
|
DELETE |
titleauthor |
FROM |
titleauthor, deleted |
WHERE |
titleauthor.title_id = deleted.title_id |
"Deleted from titleauthor" |
|
GO |
|
Чтобы проверить этот триггер, используйте оператор DELETE
следующим образом:
DELETE |
titles |
WHERE |
title_id = "PC1035" |
GO |
|
Если выполнить этот оператор DELETE, то произойдет активизация триггера. Вы увидите сообщение с количеством затронутых строк для события модификации данных по таблице titles, после которого следуют сообщения, заданные в трех операторах PRINT из этого триггера, и
сообщения о количестве затронутых строк в трех других таблицах; эти выходные сообщения показаны ниже:
(1 row(s) affected)
Deleted from sales
(5 row(s) affected)
Deleted from roysched
(1 row(s) affected) Deleted from titleauthor
(1 row(s) affected)
Пример. Создадим UPDATE-триггер, который будет просматривать колонку price (цена) при модификации таблицы titles, чтобы убедиться, что цена книги не возросла более чем на 10 процентов. В противном случае будет использован оператор ROLLBACK, который выполнит откат данного триггера и оператора, вызвавшего триггер. Если триггер активизирован из транзакции, то произойдет откат всей транзакции. Таблицы deleted и inserted
используются в данном примере для проверки изменения цены. Ниже
приводится определение этого триггера:
CREATE TRIGGER Update_Price_Check
ON titles
FOR UPDATE
AS |
|
DECLARE |
@orig_price money, @new_price money |
SELECT |
@orig_price = price from deleted |
"orig price =" |
|
CONVERT(varchar(6),@orig_price) |
|
SELECT |
@new_price = price from inserted |
"new price =" |
|
CONVERT(varchar(6),@new_price) |
IF (@new_price > (@orig_price * 1.10))
BEGIN
PRINT "Rollback occurred"
ROLLBACK
END
ELSE
PRINT "Price is OK"
GO
Чтобы проверить этот триггер, выполните сначала следующие
операторы, чтобы проверить текущую цену книги с идентификатором заголовка (title_id) BU1111:
SELECT |
price |
FROM |
titles |
WHERE |
title_id = "BU1111" |
GO |
|
Цена составляет $11.95. Теперь попробуем увеличить цену на 15
процентов с помощью следующих операторов:
UPDATE titles
SET |
price = price * 1.15 |
WHERE |
title_id = "BU1111" |
GO
Вы увидите следующие результаты: orig price = (исходная цена)
11.95
new price = (новая цена)
13.74
Rollback occurred (Произошел откат)
Произошла активизация триггера, который вывел исходную цену и
новую цену и выполнил откат (поскольку цена возросла более чем на 10
процентов).
Теперь снова проверим цену, чтобы убедиться, что был выполнен откат
этой модификации. Используйте следующий T-SQL-набор:
SELECT |
price |
FROM |
titles |
WHERE |
title_id = "BU1111" |
GO |
|
Цена снова стала равной $11.95, а это означает, что был выполнен
откат модификации.
Теперь увеличим цену на 9 процентов и убедимся, что цена изменена.
Для этой модификации используется следующий T-SQL-набор:
UPDATE titles
SET |
price = price * 1.09 |
WHERE |
title_id = "BU1111" |
GO |
|
SELECT |
price |
FROM |
titles |
WHERE |
title_id = "BU1111" |
GO |
|
Цена стала равной $13.03, и поскольку изменение составило меньше 10
процентов, то триггер не инициировал откат.
ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ
В базе данных, созданной на лабораторной работе №1, 2 создайте
хранимые процедуры и триггеры.
