Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД Лабораторный практикум.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
723.46 Кб
Скачать

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 Регион

VALUES (102, 'Россия', '', 'Москва', 'пр.Калинина, 50',

'339-62- 10', '(095) 339-62-11')

INSERT INTO Регион

VALUES (401, 'Литва', '', 'Вильнюс', 'ул.Чурлёниса, 19', NULL,

'(055) 33-27-75')

GO

Разработайте программный код (не обязательно в виде хранимой процедуры), который формирует таблицу следующего вида:

Страна

Число клиентов

Число поставщиков

. . .

. . .

. . .

При этом используйте созданную при выполнении лабораторной работы 8 хранимую процедуру pr_КлиентПоставщик_СтранаИнтервал, которая подсчитывает, сколько различных клиентов и поставщиков из указанной страны фигурирует в таблице Заказ (за указанный интервал времени). Эта хранимая процедура должна применяться для формирования каждой строки в указанной выше таблице. Число строк этой таблицы должно равняться числу различных стран, фигурирующих в таблице Регион.

3. Создайте таблицу Протокол со структурой, приведенной ниже, в которой должны автоматически фиксироваться все действия, вызванные вставкой, обновлением или удалением данных в таблице Товар. Каждая команда, изменяющая содержимое таблицы Товар, должна быть отражена отдельной строкой в таблице Протокол.

Номер

ДатаВремя

Пользователь

Действие

ЧислоСтрок

. . .

. . .

. . .

. . .

. . .

Здесь столбец Номер является автоинкрементным первичным ключом. В столбце Действие указывается одна из трех возможных операций с данными: «Вставка», «Обновление», «Удаление». Столбец ЧислоСтрок будет содержать данные о числе вставленных, либо обновленных, либо удаленных строк в таблице Товар.

Усложненный вариант. Таблица Протокол должна включать в себя еще один столбец КодыТоваров, в котором указываются коды товаров, фигурирующие во вставленных, обновленных или удаленных строках.

4. Доведите до завершения рассмотренную выше в виде примера задачу корректировки значений полей Стоимость и СтоимостьНВ в таблице Заказ. Значения этих полей должны автоматически обновляться не только при изменении цены товара (как было реализовано в примере), но и при изменении количества заказанного товара, а также вставке новых строк в таблицу Заказ. Кроме того, значение столбца СтоимостьНВ должно автоматически обновляться также при изменении курса соответствующей валюты.

5. Разработайте программный код для проверки работы разработанных хранимых процедур и триггеров.

6. Фрагменты кода, относящиеся к выполнению задания, сохраните в файле D:\Work\X7230ХХХ\Script4.sql.

7. Удалите базу данных Склад_ХХХ. Для этого в ее контекстном меню выберите команду Delete и затем в появившемся окне Delete Object установите флажок Close Existing Connections.