Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_Laboratornyi_774_praktikum.doc
Скачиваний:
28
Добавлен:
17.06.2021
Размер:
921.09 Кб
Скачать

If update(ДатаЗаказа)

BEGIN

PRINT 'Обновление столбца "ДатаЗаказа" запрещено'

ROLLBACK TRAN -- откат транзакции

END

GO

Примечание. Команда PRINT в отличие от команды SELECT выводит сообщения не на панель Results, а на панель Messages окна Query утилиты SQL Server Management Studio.

Теперь, не смотря на то, что вы являетесь владельцем базы данных, вы уже не можете редактировать значения столбца ДатаЗаказа в таблице Заказ:

SELECT * FROM Заказ -- команда 1

UPDATE Заказ -- команда 2

SET ДатаЗаказа = ДатаЗаказа + 10

GO -- команда 3

SELECT * FROM Заказ -- команда 4

Примечание. Все 4 команды, приведенные выше, выделите подсветкой в окне Query и выполните за один раз. Тогда будут показаны две таблицы Заказ (до и после корректировки).

Пример 2. Предварительно добавим в таблицу Заказ два новых столбца: Стоимость и СтоимостьНВ:

ALTER TABLE Заказ ADD Стоимость MONEY NULL

ALTER TABLE Заказ ADD СтоимостьНВ MONEY NULL

GO

Убедимся, что столбцы Стоимость и СтоимостьНВ (стоимость в национальной валюте) добавились в таблицу Заказ и во всех строках получили значение NULL:

SELECT * FROM Заказ

GO

Теперь создадим триггер для таблицы Товар, срабатывающий при любом изменении цены товара и корректирующий в таблице Заказ значения полей Стоимость и СтоимостьНВ в тех строках, которые соответствуют товару с изменившейся ценой:

CREATE TRIGGER tr_Товар_Цена

ON Товар

FOR UPDATE AS

If update(Цена)

BEGIN

-- объявляем локальные переменные

DECLARE @КодТовара INT, @Цена MONEY, @ЦенаНВ MONEY

-- присваиваем значения локальным переменным, выбирая эти

-- значения из таблицы inserted

SELECT @КодТовара = inserted.КодТовара,

@Цена = inserted.Цена, @ЦенаНВ = inserted.Цена *

Валюта.КурсВалюты

FROM inserted INNER JOIN Валюта

ON inserted.КодВалюты = Валюта.КодВалюты

-- обновляем значения стоимостей в таблице Заказ

UPDATE Заказ

SET Стоимость = Количество * @Цена,

СтоимостьНВ = Количество * @ЦенаНВ

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

END

GO

Проверим работу созданного триггера. Для этого изменим цену товара с кодом 111:

SELECT * FROM Товар

UPDATE Товар

SET Цена = 50

WHERE КодТовара = 111

SELECT * FROM Товар

GO

Теперь посмотрим содержимое таблицы Заказ и убедимся, что подсчитались стоимости заказов, относящиеся к товарам с кодом 111:

SELECT * FROM Заказ

GO

Однако данный триггер обладает тем недостатком, что отслеживает изменение цены лишь одного товара, даже если были одновременно изменены цены сразу у нескольких товаров. Убедимся в этом, изменив цены сразу для всех товаров:

SELECT * FROM Товар

UPDATE Товар

SET Цена = Цена * 2

SELECT * FROM Товар

GO

Снова посмотрим содержимое таблицы Заказ и убедимся, что подсчитались стоимости заказов только по товару, представленному первой строкой таблицы Товар:

SELECT * FROM Заказ

SELECT * FROM Товар

GO

Устраним указанный выше недостаток путем внесения изменения в код триггера:

ALTER TRIGGER tr_Товар_Цена

ON Товар

FOR UPDATE AS