Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
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 IF UPDATE(Цена) BEGIN DECLARE @КодТовара INT, @Цена MONEY, @ЦенаНВ MONEY -- объявляем курсор myCursor. Набор данных, связанный с курсором и -- построенный на основе таблицы inserted, будет содержать три столбца DECLARE myCursor CURSOR LOCAL STATIC
FOR SELECT inserted.КодТовара, inserted.Цена, inserted.Цена * Валюта.КурсВалюты FROM inserted INNER JOIN Валюта ON inserted.КодВалюты = Валюта.КодВалюты -- открываем курсор OPEN myCursor -- заносим в курсор данные первой строки набора данных и считываем -- значения ее полей в переменные @КодТовара, @Цена, @ЦенаНВ FETCH FIRST FROM myCursor INTO @КодТовара, @Цена, @ЦенаНВ
-- организуем цикл, необходимый для последовательной работы с остальными -- строками набора данных с целью обновления стоимостей в таблице Заказ WHILE @@FETCH_STATUS = 0 BEGIN UPDATE Заказ SET Стоимость = Количество * @Цена, СтоимостьНВ = Количество * @ЦенаНВ WHERE КодТовара = @КодТовара FETCH NEXT FROM myCursor INTO @КодТовара, @Цена, @ЦенаНВ END -- закрываем курсор CLOSE myCursor -- освобождаем курсор DEALLOCATE myCursor END GO Ç Проверим работу триггера, снова изменив цены сразу для всех товаров, после чего убедимся, что пересчитались стоимости всех заказов, представленных строками таблицы Заказ: É SELECT * FROM Товар UPDATE Товар SET Цена = Цена / 2 SELECT * FROM Товар SELECT * FROM Заказ GO Ç
Задание к работе 1. Создайте хранимую процедуру pr_Стоимость_ВалютаИнтервал для решения более общей задачи по сравнению с задачей, рассмотренной в разделе I, а именно: необходимо подсчитать суммарную стоимость всех товаров, заказанных в течение указанного интервала времени, однако не в национальной валюте, а в валюте, указанной пользователем (в частности, может быть указана и национальная валюта). Эта процедура должна иметь три входных параметра (@КодВалюты, @НачалоИнтервала, @КонецИнтервала) и один выходной параметр (@Стоимость). 2. Добавьте в таблицу Регион две новые строки, используя следующие команды: É INSERT INTO Регион
|
|||||
Последнее изменение этой страницы: 2017-01-25; просмотров: 152; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.252.23 (0.008 с.) |