- •Кафедра экономической информатики
- •Базы данных
- •Содержание
- •Введение
- •Лабораторная работа №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.
Лабораторная работа №7. Курсоры и триггеры в языке Transact-sql
Цель работы
Ознакомиться с использованием курсоров в языке Transact-SQL.
Освоить способы создания триггеров в языке Transact-SQL.
Задачи
Объявление и открытие курсора с целью манипулирования строками набора данных.
Закрытие и освобождение курсора.
Реализация бизнес-правил с помощью триггеров.
Получение информации об изменениях в данных с помощью триггерных таблиц inserted и deleted.
Использование команд управления транзакциями.
Методические указания
При помощи пользовательского меню Windows запустите утилиту SQL Server Management Studio, после чего на панели Object Explorer в древовидной структуре раскройте папку Databases.
С помощью команды меню File►Open►File загрузите сценарий из файла D:\Work\X7230ХХХ\script.sql в окно Query.
Выполните сценарий, нажав на панели инструментов кнопку Execute (или клавишу F5). В результате будет создана база данных Склад_ХХХ.
Обновите данные на панели Object Explorer. Для этого используйте команду Refresh в контекстном меню папку Databases или соответствующую кнопку в верхней части панели. В результате база данных Склад_ХХХ станет видимой на панели Object Explorer.
Закройте окно Query, содержащее сценарий script.sql. Затем на панели инструментов нажмите кнопку New Query, и откройте новое пустое окно Query, предназначенное для формирования нового сценария script4.sql. Готовые к исполнению команды (пакеты) языка Transact-SQL, из которых будет формироваться сценарий, выделены ниже при помощи стрелок и .
Сделайте активной созданную базу данных Склад_ХХХ:
USE Склад_ХХХ
GO
Раздел I. Использование курсоров в языке Transact-sql
Курсор можно рассматривать как механизм, предоставляющий пользователю доступ к любой строке набора данных, связанного с курсором и формируемого с помощью команды выборки данных SELECT. При этом в каждый момент времени можно работать только с одной строкой набора данных. Далее можно перейти к другой строке и т.д.
Существуют статические и динамические курсоры. Статический курсор представляет собой моментальный снимок выбираемых строк на момент его открытия. В дальнейшем содержимое такого курсора не меняется и хранится в системной базе данных tempdb.
Динамические курсоры каждый раз обновляются при обращении к его строкам (т.е. обращение к другой строке формирует набор данных заново путем выполнения команды SELECT). При работе с динамическими курсорами пользователи могут вносить изменения в строки набора данных с помощью команд UPDATE, INSERT, DELETE. Однако каждая такая команда за один раз может работать только с одной строкой.
Кроме того, курсоры бывают последовательные (Forward-only) и прокручиваемые (Scrollable). Последовательные курсоры обеспечивают только последовательное считывание строк в прямом направлении, т.е. начиная с первой строки и заканчивая последней.
Прокручиваемые курсоры обеспечивают как последовательное считывание строк в обоих направлениях (прямом и обратном), так и обращение к произвольной строке набора данных. Однако они работают медленнее, чем последовательные курсоры.
Имеются еще так называемые ключевые курсоры, которые представляют собой набор ссылок на строки набора данных, формируемого командой SELECT. Таким образом, ключевые курсоры выбирают не всю строку, а лишь ключевые поля, позволяющие, в свою очередь, однозначно идентифицировать каждую строку набора данных, связанного с курсором. Такой подход позволяет отображать в курсоре любые изменения, возникающие в исходном наборе данных за счет действий других пользователей. Однако набор ключей формируется только в момент открытия курсора, помещается в системную базу данных tempdb и впоследствии не изменяется.
Весь процесс использования курсора включает в себя пять этапов.
1. Объявление курсора. Подразумевает указание его имени и запроса SELECT, который будет использоваться для формирования набора данных, связанного с курсором. Также указывается тип курсора. Команда имеет две разновидности, различающиеся синтаксисом (см. [1], стр. 1224).
Синтаксис стандарта SQL-92:
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
Синтаксис Transact-SQL (с более широкими возможностями) :
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
2. Открытие курсора. В процессе открытия курсора выполняется ассоциированный с курсором запрос SELECT, в результате чего создается связанный с курсором набор данных. Команда имеет следующий синтаксис (см. [1], стр. 1228):
OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }
3. Манипуляции со строками курсора. После того, как курсор открыт, можно приступать к выборке данных из этого курсора, а если тип курсор позволяет, то и к операциям обновления и удаления данных.
Команда считывания строки данных из курсора имеет следующий синтаксис (см. [1], стр. 1229):
FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ] FROM ] { { [ GLOBAL ] cursor_name } | @cursor_variable_name } [ INTO @variable_name [ ,...n ] ]
Примечание. Непосредственно после слова FETCH опцией указывается строка, которую нужно выбирать, поэтому сначала эта строка становится текущей, и только после этого производится выборка данных. При этом возможен выход за пределы диапазона строк набора данных. Эту ситуацию можно контролировать с помощью встроенной функции @@FETCH_STATUS, которая возвращает значение 0, если последняя операция выборки данных из курсора была выполнена успешно. Если возвращается отрицательное значение, то это означает, что была предпринята попытка выборки строки, находящейся за пределами набора данных.
Можно также использовать функцию @@CURSOR_ROWS. Она возвращает количество строк набора данных, но только для статического курсора. Для динамического курсора всегда возвращается -1.
Обновление данных посредством курсора выполняется с помощью команды UPDATE, имеющей следующий синтаксис (см.[1], стр. 1232):
UPDATE table_name
SET { column_name = { expression | DEFAULT | NULL }} [ ,...n ] WHERE CURRENT OF cursor_name
Изменения, внесенные этой командой, будут касаться только текущей строки курсора. За одну операцию обновления данных допускается изменение значений полей, относящихся к одной таблице. Если курсор строится на основе нескольких таблиц и необходимо изменить все значения строки курсора, то для этого придется выполнить несколько команд UPDATE.
Кроме того, допускается изменение любых столбцов таблицы, в том числе и не входящих в набор данных курсора.
Удаление данных посредством курсора выполняется с помощью команды DELETE, имеющей следующий синтаксис (см.[1], стр. 1234):
DELETE [FROM] table_name
WHERE CURRENT OF cursor_name
При выполнении этой команды происходит удаление строки указанной таблицы, связанной с текущей строкой курсора. Если курсор строится на основе нескольких таблиц, то для удаления данных из этих таблиц необходимо выполнить команду DELETE отдельно для каждой таблицы.
4. Закрытие курсора. После того, как были выполнены все необходимые манипуляции со строками курсора, его можно закрыть. Это приводит к высвобождению выделенных для него ресурсов (например, пространства в системной базе данных tempdb) и снятию блокировок, если они были установлены в процессе работы курсора. Команда имеет следующий синтаксис (см.[1], стр. 1228):
CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name }
5. Освобождение курсора. Закрытый курсор может быть удален, что подразумевает удаление из оперативной памяти описания курсора как объекта. Если курсор закрыт, но не удален, он может быть повторно открыт для использования. При этом в него будет помещен новый набор данных.
Команда освобождения курсора имеет следующий синтаксис (см. [1], стр. 1237):
DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }
Пример. Пусть необходимо подсчитать суммарную стоимость в национальной валюте всех товаров, заказанных в течение указанного интервала времени.
Одним из вариантов решения этой задачи будет создание хранимой процедуры pr_СтоимостьНВ_Интервал с двумя входными параметрами (@НачалоИнтервала, @КонецИнтервала) и одним выходным параметром (@СтоимостьНВ).
/* Подсчет стоимости товаров в национальной валюте */
CREATE PROCEDURE pr_СтоимостьНВ_Интервал
@НачалоИнтервала DATETIME,
@КонецИнтервала DATETIME,
@СтоимостьНВ MONEY OUTPUT
AS