- •Кафедра экономической информатики
- •Базы данных
- •Содержание
- •Введение
- •Лабораторная работа №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 @НачалоИнтервала is null
SET @НачалоИнтервала = getdate() - 365
If @КонецИнтервала is null
SET @КонецИнтервала = getdate()
-- выполняем начальную установку
SET @СтоимостьНВ = 0
-- объявляем локальную переменную @СтоимостьЗаказа
DECLARE @СтоимостьЗаказа MONEY
-- объявляем курсор myCursor. При этом набор данных, связанный
-- с курсором, будет содержать всего один столбец
DECLARE myCursor CURSOR LOCAL STATIC
FOR
SELECT Заказ.Количество * Товар.Цена * Валюта.КурсВалюты
FROM Заказ
INNER JOIN Товар ON Заказ.КодТовара = Товар.КодТовара
INNER JOIN Валюта ON Товар.КодВалюты = Валюта.КодВалюты
WHERE Заказ.ДатаЗаказа BETWEEN @НачалоИнтервала AND
@КонецИнтервала
-- открываем курсор
OPEN myCursor
-- заносим в курсор значение первой строки набора данных и
-- считываем это значение в переменную @СтоимостьЗаказа
FETCH FIRST FROM myCursor INTO @СтоимостьЗаказа
-- организуем цикл, необходимый для последовательной работы с остальными строками
-- набора данных с целью получения суммы стоимостей заказов в национальной валюте
WHILE @@FETCH_STATUS = 0
BEGIN
SET @СтоимостьНВ = @СтоимостьНВ + @СтоимостьЗаказа
FETCH NEXT FROM myCursor INTO @СтоимостьЗаказа
END
-- Опцию NEXT (переход к следующей строке) в команде FETCH можно
-- опускать, т.к. она подразумевается по умолчанию
-- закрываем курсор
CLOSE myCursor
-- освобождаем курсор
DEALLOCATE myCursor
GO
/* Проверка работы хранимой процедуры pr_СтоимостьНВ_Интервал */
DECLARE @Cost MONEY
EXEC pr_СтоимостьНВ_Интервал NULL, NULL, @Cost OUTPUT
SELECT getdate()-60 AS [Начало интервала], getdate() AS [Конец
интервала], @Cost AS [Стоимость заказов в НВ]
DECLARE @BeginDate DATETIME, @EndDate DATETIME
SET DATEFORMAT dmy
SET @BeginDate = '10.04.2013'
SET @EndDate = '30.12.2013'
EXEC pr_СтоимостьНВ_Интервал @BeginDate, @EndDate, @Cost OUTPUT
SELECT @BeginDate AS [Начало интервала], @EndDate AS [Конец
интервала], @Cost AS [Стоимость заказов в НВ]
GO
Раздел II. Создание триггеров в языке Transact-sql.
Триггеры представляют собой хранящиеся в базах данных подпрограммы на языке SQL, выполняющиеся автоматически при операциях вставки, обновления и удаления данных в таблицах базы данных. Каждый триггер связан только с одной из таблиц базы данных. Автоматическое срабатывание триггеров в ответ на изменения табличных данных позволяет использовать их, например, для реализации сложных алгоритмов проверки данных, для гарантии их правильности и достоверности, для создания сложного значения по умолчанию, вычисляя его с помощью других столбцов и функций Transact-SQL, для обеспечения нестандартной ссылочной целостности, поддержание которой обычными средствами SQL Server невозможно и т.д. Использование триггеров превращает сервер из пассивного наблюдателя за происходящими изменениями данных, в систему, оперативно реагирующую на такие изменения. Таким образом, правила, в соответствие с которыми осуществляются активные действия сервера, определяются триггерами (эти правила называют также бизнес-правилами).
В SQL Server 2000/2005 существует два вида триггеров:
AFTER-триггеры, которые запускаются после успешного выполнения команд, связанных с изменением табличных данных. Как команда, так и триггер реализуются в рамках одной и той же транзакции. Поэтому откат при выполнении триггера приведет и к откату команды, вызвавшей его запуск. AFTER-триггеры широко используются и полезны, например, в тех случаях, когда при модификации строк необходимо сравнивать исходные значения полей с их новыми значениями. С каждой таблицей может быть связано несколько AFTER-триггеров;
INSTEAD OF-триггеры, тело которых выполняется вместо операций вставки, обновления и удаления строк, вызвавших запуск триггера этого вида. С каждой таблицей может быть связано не более трех AFTER-триггеров (по одному для каждой из команд INSERT, UPDATE, DELETE). Триггеры этого вида могут создаваться не только для таблиц, но и для представлений.
Синтаксис команды создания триггера (см. [1], стр. 1242):
CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { FOR [ { AFTER | INSTEAD OF }]
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } }
В этой команде, в частности, присутствуют функции UPDATE(column) и COLUMNS_UPDATED( ), используемые для определения того, какой столбец или группу столбцов пользователь пытается изменить (см. [1], стр. 1244-1246). Кроме того, всегда можно получить полную информацию об изменениях, которые пытается произвести пользователь. Эту информацию дают таблицы inserted и deleted, которые автоматически создаются сервером при запуске триггера. Содержимое этих таблиц зависит от команды, вызвавшей запуск триггера:
Команда INSERT. В таблице inserted будут содержаться все строки, которые пользователь пытается вставить в таблицу. Таблица deleted будет пуста.
Команда DELETE. В таблице deleted будут содержаться все строки, которые пользователь пытается удалить. Таблица inserted будет пуста.
Команда UPDATE. В таблице deleted будут содержаться все строки, которые пользователь пытается изменить. В таблице inserted указываются строки, которые будут внесены в таблицу вместо соответствующих строк таблицы deleted.
Для внесения изменений в текст существующего триггера используется та же команда, что и для его создания, с тем лишь отличием, что вместо зарезервированного слова CREATE используется слово ALTER (см. [1], стр. 1246).
Для удаления триггера используется команда, имеющая следующий синтаксис (см. [1], стр. 1247):
DROP TRIGGER { trigger } [ ,...n ]
В кодах триггеров часто используется команда ROLLBACK TRAN (отмена или откат транзакции). Кроме нее в программах на языке Transact-SQL используются также команды BEGIN TRAN (старт транзакции), COMMIT TRAN (подтверждение транзакции) и SAVE TRAN (создание точки сохранения транзакции). Подробнее см. в [1], стр. 1247. Например, отладку какой-нибудь команды или фрагмента программы, вносящих изменения в данные, можно начать со старта транзакции, а в самом конце выполнить команду ROLLBACK TRAN, восстановив тем самым первоначальные значения измененных данных:
SELECT * FROM Валюта -- просмотр исходных данных
BEGIN TRAN -- старт транзакции
UPDATE Валюта -- обновление данных
SET КурсВалюты = КурсВалюты * 2
SELECT * FROM Валюта -- просмотр измененных данных
ROLLBACK TRAN -- откат транзакции
SELECT * FROM Валюта -- снова просмотр исходных данных
GO
Рассмотрим два примера по созданию триггеров.
Пример 1. Запретим с помощью триггера возможность модификации данных в столбце ДатаЗаказа таблицы Заказ.
CREATE TRIGGER tr_Заказ_ДатаЗаказа
ON Заказ
FOR UPDATE AS