
- •Кафедра экономической информатики
- •Базы данных
- •Содержание
- •Введение
- •Лабораторная работа №1. Логические и физические модели данных
- •Методические указания
- •Задание к работе
- •Раздел I. Создание сущностей в eRwin
- •Раздел II. Создание связей между сущностями, подмножеств модели и хранимых отображений. Переход к физической модели данных
- •Раздел III. Выполнение операции прямого проектирования
- •Раздел IV. Выполнение операции обратного проектирования
- •Лабораторная работа №2. Усложненные диаграммы «сущность-связь»
- •Методические указания
- •Задание к работе
- •Раздел I. Создание сущностей логической модели
- •Раздел II. Создание связей между сущностями и иерархии наследования
- •Раздел III. Выполнение вариантов трансформы категориальной связи
- •Раздел IV. Выполнение методов синхронизации системного каталога базы данных и текущей модели
- •Лабораторная работа №3. Работа в среде субд «ms sql Server 2005»
- •Методические указания
- •Задание к работе
- •Раздел I. Создание базы данных и ее объектов
- •Раздел II. Управление пользователями и правами доступа к данным
- •Лабораторная работа №4. Создание базы данных и ее объектов с помощью команд языка Transact-sql
- •Методические указания и задания к выполнению
- •Раздел I. Создание базы данных и ее объектов
- •Раздел II. Ввод данных в таблицы базы данных
- •Insert into Заказ (КодКлиента, КодТовара, Количество, КодПоставщика)
- •Inner join Поставщик
- •Inner join Товар
- •Раздел III. Управление пользователями и правами доступа к данным.
- •Раздел IV. Анализ полученных результатов
- •Лабораторная работа №5. Манипулирование данными с помощью команд языка Transact-sql
- •Методические указания
- •Раздел I. Выборка данных из таблиц и представлений.
- •Раздел II. Обновление данных в таблицах и представлениях.
- •Раздел III. Удаление данных из таблиц и представлений.
- •Раздел IV. Изменение структуры таблицы.
- •Раздел V. Удаление таблицы из базы данных.
- •Задание к работе
- •Лабораторная работа №6. Программирование на языке Transact-sql
- •Методические указания
- •Раздел I. Основы программирования на языке Transact-sql.
- •Раздел II. Создание и работа с хранимыми (на сервере) процедурами.
- •If @Страна is not null
- •If @Город is not null
- •If @Город is not null
- •Insert into Валюта
- •Values(@Код, @Имя, @Шаг, @Курс)
- •If @Страна is not null
- •If @Город is not null
- •Into ##Регион
- •Раздел III. Создание и работа с определяемыми пользователем функциями.
- •Insert @rowset (КодРегиона, Страна, Область, Город)
- •Задание к работе
- •Лабораторная работа №7. Курсоры и триггеры в языке Transact-sql
- •Методические указания
- •Раздел I. Использование курсоров в языке Transact-sql
- •If @НачалоИнтервала is null
- •If @КонецИнтервала is null
- •Раздел II. Создание триггеров в языке Transact-sql.
- •If update(ДатаЗаказа)
- •If update(Цена)
- •If update(Цена)
- •Inserted.Цена * Валюта.КурсВалюты
- •Задание к работе
- •Литература Основная
- •Дополнительная
- •Базы данных
- •220013, Минск, п. Бровки, 6.
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.