Академический Документы
Профессиональный Документы
Культура Документы
ПРОЕКТИРОВАНИЯ БД.
СОЗДАНИЕ БАЗЫ
ДАННЫХ В СУБД MS SQL
SERVER
ПРАКТИКУМ для лабораторных
работ по дисциплине «Системы баз
данных»
Оглавление
1
..................................................................................................................................... 47
Задание 2. Создание таблиц и индексов базы данных с помощью команд языка
Transact-SQL .............................................................................................................. 47
Задание 3. Сохранение сценария. Создание базы данных с помощью сценария49
Задание 4. Подготовка базы данных для ввода данных ........................................ 50
Задание 5. Ввод данных в таблицы базы данных посредством запросов на языке
SQL.............................................................................................................................. 50
Задание 6. Создание представления базы данных ................................................. 53
Задание 7. Анализ полученных результатов .......................................................... 54
3
Использование курсоров и триггеров в языке Transact-SQL.............................. 104
Задание 1. Работа с курсорами в языке Transact-SQL ......................................... 107
Задание 2. Разработка триггеров в языке Transact-SQL ...................................... 109
Задания для самостоятельного выполнения ......................................................... 118
Задание 3. Разработка хранимой процедуры pr_Cost_CurrencyInterval............. 118
Задание 4. Разработка хранимой процедуры pr_Country_Clients_Suppliers ...... 119
Задание 5. Создание таблицы Protocol .................................................................. 119
Задание 6. Доработка триггера tr_ProductsPrice_AllGoods ................................. 120
Литература.............................................................................................................. 139
4
Лабораторная работа № 1.
Проектирование базы данных в CASE- средстве ERWin
Теоретические сведения
Реляционная модель данных была предложена в 1979 году Эдгаром
Коддом и вскоре получила самое широкое распространение.
Формальный математический аппарат, моделирующий табличное
представление данных, получил название реляционной алгебры, в которой
используются следующие основные понятия (Таблица 1. Основные понятия
реляционной алгебры.Таблица 1).
Таблица 1. Основные понятия реляционной алгебры.
Реляционная алгебра Реляционная база данных
(логическая модель) (физическая модель)
Сущность Таблица
Кортеж Строка (Запись)
Атрибут Столбец (Поле)
Домен Тип данных
5
логической модели, отличающиеся глубиной представления информации о
структуре данных:
• Модель уровня сущностей.
• Модель данных, основанная на ключах.
• Полная атрибутивная модель.
Модель уровня сущностей представляет собой модель данных верхнего
уровня, которая отражает основные бизнес-правила предметной области.
Бизнес-правила - это принятые в организации ограничения, спецификации,
критерии, соглашения по ведению учета и отчетности. Модель этого уровня не
слишком подробна и включает в себя лишь основные сущности и связи между
ними. Как правило, модель уровня сущностей используется для презентаций и
обсуждения структуры данных с экспертами предметной области.
Модель данных, основанная на ключах, является более подробной и
включает в себя все сущности, их первичные ключи, а также связи между
сущностями.
Полная атрибутивная модель дает наиболее детальное представление о
структуре данных и включает все сущности, атрибуты, домены и связи.
Сущности, как правило, приведены к третьей нормальной форме.
Эти разновидности моделей, представленные в графической форме,
называются диаграммами «сущность-связь» или ER-диаграммами (Entity -
сущность, Relationship - связь). Существуют различные варианты ER-
диаграмм, отличающиеся способами графического изображения сущностей и
связей. Первый вариант был предложен Питером Ченом в 1976 г. (нотация
Чена). Затем появились другие варианты (нотация Мартина, нотация IDEF1X,
нотация Баркера и др.).
Впоследствии был создан целый ряд программных средств для
автоматизированного построения ER-диаграмм, например, ERwin, SilverRun,
Design/IDEF, Power Designer и др. Все они относятся к классу CASE-
технологий (Computer-Aided Software Engineering - набор инструментов и
методов программной инженерии для проектирования программного
обеспечения).
Эти CASE-средства удобны тем, что в них процесс выделения сущностей,
связей, а затем и атрибутов, является итерационным (повторяющимся).
Разработав первый приближенный вариант ER-диаграммы, далее его уточняют,
опрашивая экспертов предметной области, после чего все повторяется. При
этом документацией, в которой фиксируются результаты опросов, являются
сами ER-диаграммы. Попутно выполняется нормализация данных. Процесс
заканчивается получением ER-диаграммы, соответствующей полной
6
атрибутивной модели.
Рассмотрим работу с ER-диаграммами в нотации IDEF1X, используемой в
CASE-средстве ERwin. Изучив конкретную предметную область, строим
исходную ER-диаграмму, соответствующую модели уровня сущностей
(Рисунок 1).
7
Возвращаясь к рассмотрению примера, строим на следующем
итерационном шаге ER-диаграмму, соответствующую модели данных,
основанной на ключах (Рисунок 2).
8
средства, например, ERWin можно выбрать нужную СУБД и автоматически
создать соответствующую физическую модель данных. Затем на ее основе
ERWin может сгенерировать системный каталог базы данных или
соответствующий SQL-скрипт. Этот процесс называется прямым
проектированием.
Тем самым достигается масштабируемость - создав один раз логическую
модель данных, можно генерировать физические модели данных под любую
СУБД, которую поддерживает ERwin. С другой стороны, ERwin способен по
содержимому системного каталога базы данных или SQL-скрипту воссоздать
физическую и логическую модели данных. Этот процесс называется обратным
проектированием. На основе логической модели, полученной в процессе
обратного проектирования, можно сгенерировать физическую модель и
системный каталог базы данных для другой СУБД. Тем самым решается задача
по переносу структуры базы данных с одной СУБД на другую, например, с SQL
Server на Oracle или с Access на Sybase и т.д.
Практические задания
9
В качестве шрифта по умолчанию установите любой кириллический
шрифт, например, Arial CYR (команда меню Format - Default Fonts & Colors,
далее вкладки: General и Drawing Object Text).
Логическая модель должна включать в себя шесть приведенных ниже
сущностей.
ПЕРВЫЙ АТРИБУТ В КАЖДОЙ СУЩНОСТИ СДЕЛАЙТЕ
ПЕРВИЧНЫМ КЛЮЧОМ; АТРИБУТЫ, ОТМЕЧЕННЫЕ ОДНОЙ ИЛИ
ДВУМЯ ЗВЕЗДОЧКАМИ, - НЕ СОЗДАВАЙТЕ, ТАК КАК В ДАЛЬНЕЙШЕМ
ОНИ БУДУТ СОЗДАНЫ АВТОМАТИЧЕСКИ В ПРОЦЕССЕ
УСТАНОВЛЕНИЯ СВЯЗЕЙ МЕЖДУ СУЩНОСТЯМИ.
Для новой создания сущности нужно в окне Model Explorer (по умолчанию
справа в окне ERWin) выделить в дереве модели ветвь Сущность (Entity) и
правой кнопкой мыши вызвать пункт контекстного меню New или
воспользоваться кнопкой на панели инструментов Erwin Toolbox (Рисунок 5).
Дайте сущности имя Поставщики (Suppliers).
Кнопка Новая
сущность
Создание новой
сущности через окно
Model Exproler
10
Рисунок 6. Добавление атрибутов в сущность Поставщики (Suppliers)
1. Сущность Поставщики (Suppliers)
Атрибут (Attribute) Домен (Domain) Первичный ключ (Primary Key)
SupplierID Number Да
SupplierName String
PaymentTerms String
Location** Number
Заметки Blob
2. Сущность Товары (Products)
Атрибут (Attribute) Домен (Domain) Первичный ключ (Primary Key)
ProductID Number Да
ProductName String
Measure String
Price Number
Currency** String
11
ClientID* Number
ProductID* Number
Quantity Number
OrderDate Datetime
DeliveryDate Datetime
Supplier** Number
12
(неидентифицируюшая связь) атрибутов дочерней сущности. ВЫШЕ В
СУЩНОСТЯХ АТРИБУТЫ ВНЕШНИХ КЛЮЧЕЙ ОТМЕЧЕНЫ
ЗВЕЗДОЧКАМИ, ПРИЧЕМ ОДНА ЗВЕЗДОЧКА УКАЗЫВАЕТ НА
ИДЕНТИФИЦИРУЮЩУЮ СВЯЗЬ 1:М, А ДВЕ - НА
НЕИДЕНТИФИЦИРУЮЩУЮ СВЯЗЬ 1:М.
Например, чтобы в сущности Поставщик (Suppliers) появился атрибут
Location нужно создать неиндефицирующую связь 1:М между родительской
сущностью Регионы (Locations) и дочерней сущностью Поставщик (Suppliers).
2. Создайте между сущностями Поставщик (Suppliers) и Товар (Products)
связь типа М:М (многие ко многим). Эта связь создается следующим образом: на
панели инструментов нужно нажать кнопку создания связи М:М (Many-to-many
relationship), после чего щелкнуть мышью на одной сущности, а затем - на
другой.
3. С помощью команды меню Model - Relationships откройте окно
Relationships и дайте имена связям, используя для этого подходящие глаголы
или глагольные формы. Для связей 1:М достаточно указать имя,
характеризующее отношение или от родительской сущности к дочерней
(Parent-to-Child) или от дочерней сущности к родительской (Child-to-Parent).
Для связи М:М следует указывать имена как Parent-to-Child так и Child-to-Parent.
Например, для связи типа М:М между сущностями Поставщик (Suppliers) и
Товар (Products) можно дать такие имена: Поставляет (Delivers) для отношения
родительской сущности к дочерней (Parent-to-Child) и Поставляется (Is
Delivered) для отношения дочерней сущности к родительской (Child-to-Parent)
(Рисунок 7).
13
4. Измените заданное по умолчанию правило ссылочной целостности
RESTRICT (Ограничить) на правило CASCADE (Каскадировать) для двух
связей: связи между сущностями Клиент (Clients) и Заказ (Orders) и связи
между сущностями Товар (Products) и Заказ (Orders). Для этого в окне
Relationships перейдите на вкладку RI Actions (Referential Integrity), выберите
вверху с помощью выпадающего списка Relationship нужную связь и далее
поменяйте правило RESTRICT на правило CASCADE в каждом из списков:
Parent Insert и Parent Update (Рисунок 8).
14
Рисунок 9. Создание предметных областей
6. С помощью команды меню Formats - Stored Display Settings…
откройте окно Stored Displays и создайте для каждого из подмножеств модели
SubjectArea1 и Subject Area2 по два новых хранимых отображения (Display2 и
Display3), отличающиеся друг от друга и от исходного отображения Display1
расположением частей модели на экране, масштабом, уровнями просмотра
модели, видимостью отдельных компонентов сущностей и связей, а также
другими характеристиками (Рисунок 10).
15
Переключение
между Subject Areas
16
8. С помощью команды меню Model - Domain Dictionary откройте окно
Domain Dictionary (Рисунок 12) и создайте на основе домена Number новый
домен Денежный. Далее свяжите атрибут Price с новым доменом Денежный.
17
9. С помощью команды меню Model - Attributes откройте окно Attributes,
перейдите на вкладку Key Group и, используя кнопку с тремя точками, а затем
кнопку New, создайте для сущностей возможные альтернативные ключи
Alternate Key и возможные инверсионные входы Inversion Entry. Включите
режим их отображения на диаграмме Format – Entity Display – Alternative Key
Designation...(Рисунок 13)
18
Рисунок 14. Полная атрибутивная модель БД Trade
10. Переключившись в режим показа физической модели, уберите
пробелы в наименованиях полей (сделав первую букву второго слова
прописной), а также проверьте и, в случае необходимости, скорректируйте их
типы и длины, ориентируясь на специфику типов данных СУБД Access
(Рисунок 15). В частности, поле Price должно иметь тип Currency.
19
11. В физической модели с помощью команды меню Model -Columns
откройте окно Columns, перейдите на вкладку Constraint и задайте для полей
условия на значения Validation Constraint и/или значения по умолчанию Default,
давая им соответствующие имена. Например, для полей Price, Quantity и Rate
условие на значение заключается в выборе только неотрицательных значений,
что обеспечивается вводом выражения: >= 0. Значением по умолчанию для
поля Country будет "Беларусь"; для поля PaymentTerms - "Предоплата"; для
поля Measure - "штука"; для поля Currency (из таблицы Product) - "BYR"; для
поля OrderDate - Date(), т.е. текущая дата; для поля DeliveryDate - Date() + 14,
т.е. через две недели от текущей даты (Рисунок 16).
20
13. В физической модели выделите мышью связь М:М между таблицами
Поставщик (Suppliers) и Товар (Products), после чего нажмите кнопку Many to
Many Transform на панели инструментов (с помощью команды меню Edit -
Many to Many Transform) и запустите мастер преобразования связи М:М (на всех
шагах работы мастера нажимайте кнопку Далее). В результате эта связь будет
преобразована в две связи 1:М путем создания дополнительной связующей
таблицы (Рисунок 18).
22
Откройте окно Схема данных и проанализируйте структуру связей между
таблицами. В частности, используя контекстное меню связи, убедитесь, что
связи имеют определенные на этапе разработки модели в ERWin свойства.
В итоге схема данных должна выглядеть так, как показано на
рисунке Рисунок 21.
23
2. В ERwin с помощью команды меню Tools - Reverse Engineer
запустите мастер выполнения процесса обратного проектирования. На его
странице Reverse Engineer - Select Template задайте тип новой модели -
Логическая/Физическая, целевую базу данных - Access. Нажмите кнопку Next
(Рисунок 22).
24
Рисунок 23. Физическая модель данных после операции обратного
проектирования.
6. После завершения процесса обратного проектирования с помощью
команды меню Database - Database Connection откройте окно Access
Connection и разорвите соединение с базой данных путем нажатия кнопки
Disconnect.
7. С помощью команды меню Format - Default Fonts & Colors откройте
окно Default Fonts & Colors, выберите вкладку General и установите в качестве
шрифта по умолчанию любой кириллический шрифт, например, Arial CYR.
Внизу, в группе переключателей Apply To, выберите переключатель All Objects,
после чего нажмите кнопку OK.
8. Убедитесь, что полученная модель данных соответствует схеме
данных созданной ранее базы данных Trade.mdb.
Сохраните модель данных на жестком диске в файле Trade_reverse.erwin.
Кроме прямого и обратного проектирования ERwin поддерживает
синхронизацию между логической моделью и системным каталогом СУБД на
протяжении всего жизненного цикла создания информационной системы. Как в
логическую модель, так и в объекты базы данных можно вносить изменения,
после чего ERwin позволяет выполнить синхронизацию объектов модели и
базы данных (то есть привести их в соответствие друг с другом).
25
которую поддерживает ErWin, то проведите операцию прямого проектирования
с генерацией таблиц и схемы данных в СУБД MS SQL Server.
Если нет, то в окне прямого проектирования БД для целевой СУБД MS
SQL Server (Рисунок 24) нажмите кнопку Preview, скопируйте
сгенерированный сценарий на языке Transact-SQL и попробуйте развернуть БД
в СУБД MS SQL Server путем выполнения файла сценария.
Кнопка
Preview
27
Лабораторная работа № 2.
Создание БД в среде СУБД MS SQL Server
Теоретические сведения
Основным инструментом для конфигурирования, управления и
администрирования всех компонентов Microsoft SQL Server является
интегрированная среда SQL Server Management Studio (SSMS) (Рисунок 26),
которая мжет быть использована для доступа, настройки, администрирования и
разработки всех компонентов SQL Server, базы данных SQL Azure и хранилища
данных SQL, а также управления ими. Среда SSMS предоставляет единую
полнофункциональную служебную программу, которая сочетает в себе
обширную группу графических инструментов с рядом редакторов сценариев
для доступа к службе SQL Server для разработчиков и администраторов баз
данных всех профессиональных уровней.
28
интерфейс Management Studio можно управлять службами оповещений,
репликации, отчетности, более ранними версиями и др. В SQL Server
Management Studio используются следующие основные окна:
• окно Зарегистрированные Серверы (Registered Servers) позволяет
выбрать сервер SQL, работа с которым будет выполняться;
• окно Обозреватель объектов (Object Explorer) позволяет выполнять
работу с объектами выбранного сервера, просматривать и изменять их
свойства;
• окно Обозреватель решений (Solutions Explorer) реализует для
разработчика возможность просматривать исходный код и группировать его в
виде логической коллекции, которая при необходимости может быть
перенесена на другую базу данных;
Окно Обозреватель решений (Object Explorer) (Рисунок 27) отображается
в левой части окна утилиты SQL Server Management Studio и позволяет
выполнять запуск и остановку сервера, создание баз данных, их соединение и
отключение, а также настройку свойств сервера, создание объектов баз данных
(таких как таблицы, представления и хранимые процедуры), генерацию
сценариев на языке Transact-SQL, управление правами доступа к объектам,
мониторинг работы сервера, просмотр системных журналов, настройку
механизма репликации и многое другое.
Для работы с объектами, которые отображаются в окне Object Explorer,
необходимо щелкнуть на выбранном объекте правой кнопкой мыши и выбрать
в контекстном меню требуемый пункт. В контекстном меню отображается
уникальный набор свойств для каждого объекта. Также контекстное меню
позволяет выполнить такие действия с объектом как удаление, переименование,
создание новой таблицы, подключение, просмотр зависимостей таблицы,
отключение, настройка свойств объекта, удаление, изменение таблицы,
резервное копирование базы данных, восстановление базы данных из резервной
копии, а также другие действия. Состав контекстного меню и набор доступных
действий зависит от типа выбранного объекта.
Главным преимуществом окна Обозреватель объектов является
возможность генерировать сценарии создания отображаемых в нем объектов.
Это упрощает и ускоряет процесс создания приложений. Для автоматизации
этой операции предусмотрено использование мастера сценариев. Это средство
автоматизации позволяет создавать резервную копию базы данных, создавать
тестовую базу данных или необходимый объект. Используя мастер сценариев
для нескольких объектов, можно разработать или отдельный сценарий для
создания каждого объекта, либо общий сценарий для создания нескольких
29
объектов одновременно. При этом реализующий сценарий может быть выведен
в отдельный файл, в буфер обмена или в редактор запросов SQL Server
Management Studio.
30
выступающие в качестве листьев дерева, могут быть связаны с одним из
проектов или напрямую с решением. Листья обычно представляют собой
файлы, которые могут содержать информацию не только об определенном
объекте, но и о целом классе подобных объектов. Эти классы могут создаваться
разработчиками на одном из следующих языков запросов: Transact-SQL,
Analysis Server и XMLA.
Утилита SQL Server Management Studio поддерживает несколько
различных типов проектов: SQL Server Scripts, SQL Mobile Script,
Analysis Server Scripts.
Практические задания
31
Задание 2. Создание базы данных
32
4. В таблице Файлы базы данных (Database files) в столбце Логическое
имя (File Name) в первой строке появится введенное имя БД. Это файл,
который будет хранить данные БД. Файловая группа по умолчанию PRIMARY.
Во второй строке к имени БД будет добавлен постфикс _log. Этот файл будет
хранить журнал транзакций БД. В столбце Начальный размер (Initial Size) и в
столбце Автоувеличение/Максимальный размер (Autogrowth) оставим значения
без изменений. При необходимости их можно настроить, нажав на кнопку с
тремя точками. В столбце Путь (Path) нажмите справа кнопку с тремя точками
и выберите созданную папку, например, D:\TRADE_Ivanov для обоих файлов
(Рисунок 30).
33
Рисунок 31. Окно Параметры базы данных, в котором можно указать
имена папок, в которые по умолчанию будут сохраняться файлы создаваемых
БД.
34
Рисунок 32. Таблица Locations в режиме Конструктора.
Первичный ключ задать через контекстное меню или нажатием
соответствующей кнопки при выделенном столбце.
Примечание. Для корректировки таблиц (изменения данных и/или
структуры) необходимо снять флажок в параметре Запретить сохранение
изменений, требующих повторного создания таблицы меню Сервис –
Параметры – Конструкторы – Конструкторы таблиц и баз Источник данных
(Рисунок 33. Настройка возможности корректировки таблиц.Рисунок 33).
35
Рисунок 33. Настройка возможности корректировки таблиц.
После создания таблиц сохраните их. Чтобы открыть конструктор
таблицы: выделите ее имя в Обозревателе объектов и через вызов
контекстного меню выберите команду Проект.
Создайте приведенные ниже таблицы (Рисунок 34 – 32):
36
Рисунок 36. Таблица Currency (Валюта) в режиме Конструктора.
37
Рисунок 39. Задание свойств для создания автоинкрементируемого
столбца.
3. Задайте для столбцов значения по умолчанию с помощью свойства
Значение по умолчанию или привязка (Default Value or Binding) (окно
Свойства столбца (Column Properties) в нижней части экрана).
Значения по умолчанию:
• для столбца Country таблицы Locations будет ’Беларусь’ (одинарные
38
кавычки можно не набирать);
• для столбца Measure таблицы Products – ’штука’;
• для столбца CurrencyID (из таблицы Products) – ’BYN’;
• для столбца OrderDate таблицы Orders - getdate() текущая дата;
• для столбца DeliveryDate таблицы Orders getdate() + 14, т.е. через
две недели от текущей даты.
4. Создайте уникальные (unique) индексы:
Таблица 2. Уникальные индексы БД TRADE_XXX (Рисунок 40).
Имя таблицы Имя индекса Имена столбцов индекса
Clients UIX_ClientName ClientName
Currency UIX_CurrencyName CurrencyName
Products UIX_ProductName ProductName
Locations UIX_Four Country, Region, City, Address
39
которому создается индекс. Далее нажмите кнопку Закрыть.
5. Создайте неуникальные (non unique) индексы:
40
Рисунок 42. Создание ограничения на значение поля Quantity таблицы
Orders.
41
Рисунок 43. Создание связей между таблицами Products и Currency.
2. Остальные связи создайте в окне диаграммы БД. Создайте диаграмму
для базы данных. Для этого раскройте папку БД TRADE_ХХХ_1, через
контекстное меню папки Диаграммы баз данных (Database Diagrams) выберите
команду Создать диаграмму базы данных (New Database Diagram). При
первом запуске может быть задан вопрос о подключении необходимых
компонентов. Ответьте Да.
В диаграмму включите все 5 таблиц, входящие в базу данных
TRADE_ХХХ_1.
После добавления всех таблиц создайте недостающие связи, перетащив
при нажатой левой клавише мыши поле внешнего ключа дочерней таблицы
(поставить указатель мыши на прямоугольник слева от имени поля) на поле
первичного ключа родительской таблицы или наоборот.
Обратите внимание на установку свойств связи Правило обновления и
Правило удаления в разделе Спецификация UPDATE и DELETE.
После появления на экране окна с диаграммой установите оптимальный
42
масштаб изображения и расположите элементы диаграммы наиболее удобным
образом, а также включите режим показа названий связей между таблицами.
Для этого щелкните мышью на свободном месте диаграммы и, вызвав далее
контекстное меню, выберите команду Показать подписи отношений (Show
Relationship Labels). Сохраните диаграмму под именем Diagram_Start после
чего закройте ее (Рисунок 44).
43
получить результат выполнения запроса.
44
носитель данных.
Чтобы снова начать работать с базой данных TRADE_ХХХ_1, нужно
выполнить операцию ее присоединения. Для этого выберите в контекстном
меню папки Базы данных (Databases) команду Atach Database (Присоединить),
затем в появившемся окне нажмите кнопку Добавить (Append) и далее укажите
местоположение первичного файла БД (т.е. файла данных с расширением
.mdf).
4. Закройте утилиту SQL Server Management Studio.
45
Лабораторная работа № 3.
Создание базы данных и ее объектов с
помощью команд языка Transact-SQL
Теоретические сведения
46
Практические задания
47
Country varchar(20) NOT NULL DEFAULT ('Беларусь'),
Region varchar(20) NOT NULL,
City varchar(20) NOT NULL,
Address varchar(50) NOT NULL,
Phone char(15) NULL,
-- создание уникального индекса по четырем полям
constraint IX_Four unique(Country, Region, City, Address)
)
Создайте таблицу Clients:
CREATE TABLE Clients(
ClientID int PRIMARY KEY IDENTITY(1,1) NOT NULL,
ClientName varchar (40) NOT NULL,
HeadFullName varchar (60) NULL,
Location int NULL,
-- создание ограничения по внешнему ключу
CONSTRAINT FK_Clients_Locations FOREIGN KEY (Location)
REFERENCES Locations(LocationID)
ON UPDATE CASCADE
)
GO
Создайте таблицу Currency:
CREATE TABLE Currency(
CurrencyID char(3) PRIMARY KEY NOT NULL,
CurrencyName varchar(30) NOT NULL,
Rate smallmoney NOT NULL CHECK (Rate>0)
)
Создайте таблицу Products:
CREATE TABLE Products(
ProductID int PRIMARY KEY NOT NULL,
ProductName varchar(50) NOT NULL,
Measure char(10) NULL,
Price money NULL CHECK (Price>=0),
Currency char(3) NULL,
CONSTRAINT FK_Products_Currency FOREIGN KEY(Currency)
REFERENCES dbo.Currency (CurrencyID)
)
GO
Создайте таблицу Orders:
CREATE TABLE Orders(
OrderID int IDENTITY(1,1) NOT NULL,
Client int NOT NULL,
Product int NOT NULL,
Quantity numeric(12,3) NULL,
48
OrderDate date NULL DEFAULT getdate(),
DeliveryDate date NULL DEFAULT getdate()+14,
PRIMARY KEY ( -- составной первичный ключ
OrderID ASC,
Client ASC,
Product ASC
),
CONSTRAINT FK_Orders_Clients FOREIGN KEY(Client)
REFERENCES dbo.Clients (ClientID)
ON UPDATE CASCADE,
CONSTRAINT FK_Orders_Products FOREIGN KEY(Product)
REFERENCES dbo.Products (ProductID)
ON UPDATE CASCADE
)
GO
2. Создание уникальных и неуникальных индексов таблицы
CREATE UNIQUE INDEX UIX_Clients ON Clients(ClientName)
CREATE UNIQUE INDEX UIX_Currency ON Currency(CurrencyName)
CREATE UNIQUE INDEX UIX_Products ON Products(ProductName)
CREATE INDEX IX_Locations ON Locations (Country, City)
CREATE INDEX IX_Products ON Products(ProductName, Measure)
CREATE INDEX IX_Orders ON Orders(OrderDate)
3. Создайте диаграмму данных для созданной БД
Диаграмму данных создайте также, как в задании 3.2 лабораторной работы
номер 2. Проверьте правильность установленных при создании таблиц связей.
Созданная диаграмма должна точно соответствовать Рисунок 44.
49
4. Удалите созданную базу данных TRADE_ХХХ, поскольку теперь мы ее
всегда можем сгенерировать с помощью сценария CreateDB_Tables.sql. Для
этого в окне Обозреватель решений (Object Explorer) выберите базу данных
TRADE_ХХХ и в ее контекстном меню выполните команду Удалить (Delete).
Замечание. Базу данных невозможно удалить, если предварительно не
закрыть существующее соединение или не переключиться на другую базу
данных, что и было сделано в предыдущем пункте. Можно обойтись без
выполнения предыдущего пункта и сразу удалить текущую базу данных
TRADE_ХХХ, но в этом случае после появления на экране окна Удаление объекта
(Delete Object) нужно в нижней его части установить флажок Закрыть
существующие соединения (Close Existing Connections).
5. Закройте утилиту SQL Server Management Studio.
50
Рисунок 46. Таблица Locations.
51
обязательным и значение NULL в нем недопустимо.
• Возможно введение данных в несколько строк с помощью одной
команды INSERT INTO.
• Все типы текстовые данных должны быть заключены в одиночные
кавычки.
2. Вставьте данные в таблицу Clients (Рисунок 47), используя
различные варианты команды INSERT INTO:
52
Рисунок 50. Таблица Orders.
Замечание. В таблице Orders столбец OrderID является
автоинкрементным и, поэтому, его значения не приведены.
53
Рисунок 51. Результат выполнения представления OrdersCost.
54
7. Удалите созданную базу данных TRADE_ХХХ.
55
Лабораторная работа № 4.
Выборка и манипулирование данными с помощью команд
языка SQL
Подготовительные действия
1. Запуститеутилиту SQL Server Management Studio, в окне
Обозреватель объектов (Object Explorer) в древовидной структуре раскройте
папку Базы данных (Databases).
2. С помощью команды меню File - Open - File загрузите сценарий из
файла D:\FIO\TRADE_XXX\CreateDB_Insert_Data.sql в Окно запросов
(Query).
3. Выполните сценарий, нажав на панели инструментов кнопку
Выполнить (Execute) (или клавишу F5). В результате будет создана база данных
TRADE_ХХХ.
4. Обновите данные в окне Обозреватель объектов (Object Explorer).
Для этого используйте команду Обновить (Refresh) в контекстном меню папки
Базы данных (Databases) или соответствующую кнопку в верхней части окна. В
результате база данных TRADE_ХХХ станет видимой в окне Обозреватель
объектов (Object Explorer).
5. Закройте Окно запросов (Query), содержащее сценарий
CreateDB_Insert_Data.sql. Затем на панели инструментов нажмите кнопку
Новый запрос (New Query), и откройте новое пустое Окно запросов (Query),
предназначенное для формирования нового сценария DataManipulation.sql.
Сделайте активной созданную базу данных TRADE_ХХХ:
USE TRADE_ХХХ
GO
Практические задания
56
Рисунок 52. Выборка данных из одной таблицы.
2. Выборка некоторых столбцов и всех строк (вертикальный фильтр) из
одной таблицы (Рисунок 53).
57
Рисунок 55. Вертикальный и горизонтальный фильтры.
5. Выборка с сортировкой строк по столбцу Country, а при совпадении
городов - по столбцу City (Рисунок 56).
58
7. Выборка данных из трех таблиц. Выбираются данные только тех
заказов, в которых количество заказанных товаров Qauntaty больше или равно 2
(Рисунок 58).
59
Рисунок 60. Запрос с агрегирующими функциями.
10. Выборка данных из таблицы Orders с группировкой по столбцу
ProductID и подсчетом для каждой группы итоговых данных (Рисунок 61).
60
Рисунок 62. Запрос с отбором групп, удовлетворяющих условию.
12. Выборка данных из представления OrdersCost (Рисунок 63).
61
EXEC sp_helpuser
4. Список ролей (как фиксированных, так и пользовательских) базы
данных TRADE_ХХХ
EXEC sp_helprole
5. Членство ролей и пользователей в ролях базы данных TRADE_ХХХ
EXEC sp_helprolemember
62
ALTER COLUMN Weight FLOAT NULL
GO
3. Установка проверочного ограничения для поля Weight в таблице
Products.
ALTER TABLE Products
ADD CONSTRAINT СК_Products_Weight
CHECK (Weight BETWEEN 10 AND 100)
GO
4. Удаление поля Weight из таблицы Products (сначала удаляется
проверочное ограничение).
ALTER TABLE Products
DROP CONSTRAINT СК_Products_Weight
63
Задание 6. Удаление таблицы из базы данных
64
• Загрузите сценарий из файла D:\FIO\TRADE_XXX\
CreateDB_Insert_Data.sql и создайте базу данных TRёADE_ХХХ заново.
• Обновите данные в окне Обозреватель объектов (Object Explorer) и
сделайте базу данных TRADE_ХХХ видимой.
• Закройте окно со сценарием CreateDB_Insert_Data.sql и откройте
новое пустое Окно запросов (Query), предназначенное для формирования
сценария выполнения задания к лабораторной работе.
Все задания выполняйте, используя операторы языка SQL.
65
Рисунок 65. Связи таблицы Suppliers с таблицами Orders и Locations.
66
Рисунок 67. Таблица Employees (Сотрудники).
При создании таблицы обратите внимание на ее связи с другими
таблицами (Рисунок 65) и с самой собой. Для создания связи между таблицами
Orders и Employees необходимо в таблицу Orders добавить новое поле
Employee.
67
Рисунок 70. Диаграмма данных БД TRADEXXX.
68
5. В таблице Orders найдите все строки, относящиеся к клиентам из
Беларуси, а из них, в свою очередь, выберите те строки, для которых с момента
заказа прошло не более 60 дней. Кроме того, в полученном наборе строк
замените столбец Product столбцом ProductName из таблицы Products.
Результирующий набор строк отсортируйте по наименованием товаров, далее –
по полю OrderDate и далее – по полю Quantity в порядке убывания.
6. Измените представление OrdersCost, добавив в него поле Quantity
из таблицы Orders. Из представления OrdersCost выберите все строки, в
которых значение поля ProductName содержит в себе подстроку «тер» или
«тор» и значение поля Quantity больше или равно 30.
7. Подсчитайте стоимость заказов в белорусских рублях: произведение
трех величин: количество товаров в заказе (поле Quantity таблицы Orders), цена
товара (поле Price таблицы Products), значение курса белорусского рубля (поле
Rate таблицы Currency). Выведите наименование товара (поле ProductName
таблицы Products) и подсчитанную стоимость. Отсортируйте по стоимости.
8. Измените запрос предыдущего задания так, чтобы выводилась общая
сумма стоимости заказов по каждому товару. Для этого сгруппируйте данные
по полю ProductName таблицы Products. Ограничьте количество знаков после
запятой в поле стоимости заказов двумя цифрами.
9. Измените запрос предыдущего задания так, чтобы выводились
наименование только тех товаров, суммарная стоимость которых больше
заданной величины. Используйте для этого предложение HAVING оператора
SELECT.
10. С помощью команды SELECT … INTO создайте копию таблицы
Clients, обязательно включив в новую таблицу поле ClientName. Дайте имя
новой таблице Clients1. Измените значения в ClientName таблицы Clients1 так,
чтобы часть значений наименований клиентов совпадала со значениями
исходной таблицы Clients. Выполните над таблицами Clients и Clients1
операции объединения UNION, пересечения INTERSECT, разности EXCEPT.
Проанализируйте, как влияют ключевые слова DISINCT и ALL на результат
выполнения оператора UNION.
11. Измените таблицу Clients так, чтобы у нескольких клиентов в поле
Location было значение NULL, и чтобы не все регионы имели клиентов, то есть
чтобы в поле внешнего ключа Location отсутствовали некоторые значения из
поля LocationID таблицы Location. Выполните операции внутреннего INNER
JOIN, левого LEFT JOIN, правого RIGHT JOIN, полного FULL JOIN,
перекрестного CROSS JOIN соединений таблиц Clients и Locations.
69
12. *** Выберите из таблицы Employees имена и фамилии всех
руководителей (EmployeeID, Employee.Name, Employee.Surname). Используйте
операцию соединения таблицы с самой собой (самосоединение) (Рисунок 71).
Обратите внимание на псевдонимы (alias) E1 и E2 таблицы Employees,
которые используются в запросе.
70
CurrencyID CurrencyName Rate
GRV Украинские гривны 0,006
Таблица Products
ProductID ProductName Measure Price Currency
666 ПК-клавиатура штука 780 GRV
777 Разъем USB штука 85 GRV
888 Принтер EPSON штука 11650 GRV
Таблица Orders
Clients Product Quantity OrderDate DeliveryDate
4 666 12 по умолчанию по умолчанию
5 777 15 по умолчанию по умолчанию
3 888 5 по умолчанию по умолчанию
5 666 8 по умолчанию по умолчанию
71
Сохраните текущий сценарий в файле
D:\FIO\TRADE_XXX\DataManipulation.sql.
Затем удалите базу данных TRADE_ХХХ. Для этого в ее контекстном меню
выберите команду Удалить (Delete) и затем в появившемся окне Удаление
объекта (Delete Object) установите флажок Закрыть существующие
соединения (Close Existing Connections).
72
Лабораторная работа № 5.
Разработка запросов с подзапросами, Case-выражения,
табличные выражения
Подготовительные действия
1. Запуститеутилиту SQL Server Management Studio, в окне
Обозреватель объектов (Object Explorer) в древовидной структуре раскройте
папку Базы данных (Databases).
2. С помощью команды меню File - Open - File загрузите сценарий из
файла D:\FIO\TRADE_XXX\CreateDB_Insert_Data.sql в Окно запросов
(Query).
3. Выполните сценарий, нажав на панели инструментов кнопку
Выполнить (Execute) (или клавишу F5). В результате будет создана база данных
TRADE_ХХХ.
4. Обновите данные в окне Обозреватель объектов (Object Explorer).
Для этого используйте команду Обновить (Refresh) в контекстном меню папки
Базы данных (Databases) или соответствующую кнопку в верхней части окна. В
результате база данных TRADE_ХХХ станет видимой в окне Обозреватель
объектов (Object Explorer).
5. Закройте Окно запросов (Query), содержащее сценарий
CreateDB_Insert_Data.sql. Затем на панели инструментов нажмите кнопку
Новый запрос (New Query), и откройте новое пустое Окно запросов (Query),
предназначенное для формирования нового сценария SubQuery.sql. Сделайте
активной созданную базу данных TRADE_ХХХ:
USE TRADE_ХХХ
GO
Практические задания
73
Рисунок 72. Запрос с однострочным подзапросом.
2. Выведите коды заказов и наименование товаров, количество которых
в заказе больше среднего.
74
4. Выведите код, наименование товара и минимальное количество для
товаров, в которых среднее количество в заказе больше, чем у товара с кодом
111 (Рисунок 75).
75
Рисунок 77. Запрос со сложным условием в предложении WHERE.
7. Определить клиентов, имеющих поставщиков в своем регионе
(Рисунок 78).
76
9. Вывести из таблицы Employees: всех руководителей, которые сами
являются подчиненными (Рисунок 80) и всех сотрудников, у которых нет
подчиненных (Рисунок 81).
77
Рисунок 82. Запрос с выражением CASE.
2. Определить для каждого заказа: его стоимость больше, равна или
меньше средней стоимости всех заказов.
78
на 5 %, если стоимость заказа >= 5000 руб. и < = 7500 руб.
На 10 %, если стоимость заказа >= 7500 руб.
Создадим новую таблицу T_OrderCOST, в которую поместим все записи из
представления OrderCOST.
79
Рисунок 85. Запрос с табличным выражением в предложении FROM.
2. Выбрать наименования товаров и название валюты, у которых код
валюты равен EUR или BYN.
80
6. Определите поставщиков, которые поставляют только одно
наименование товара.
7. Определите заказы, у которых количество товара МЕНЬШЕ, чем
количество товара в любом заказе клиента с определенным номером.
8. Измените в таблице Clients поле Location на NULL для регионов
страны Украина. Используйте запрос на обновление с подзапросом с
многострочным подзапросом, который определяет коды регионов страны
Украина.
81
Лабораторная работа № 6.
Программирование на языке Transact-SQL
Подготовительные действия
1. Запуститеутилиту SQL Server Management Studio, в окне
Обозреватель объектов (Object Explorer) в древовидной структуре раскройте
папку Базы данных (Databases).
2. С помощью команды меню File - Open - File загрузите сценарий из
файла D:\FIO\TRADE_XXX\CreateDB_Insert_Data.sql в Окно запросов
(Query).
3. Выполните сценарий, нажав на панели инструментов кнопку
Выполнить (Execute) (или клавишу F5). В результате будет создана база данных
TRADE_ХХХ.
4. Обновите данные в окне Обозреватель объектов (Object Explorer).
Для этого используйте команду Обновить (Refresh) в контекстном меню папки
Базы данных (Databases) или соответствующую кнопку в верхней части окна. В
результате база данных TRADE_ХХХ станет видимой в окне Обозреватель
объектов (Object Explorer).
5. Закройте Окно запросов (Query), содержащее сценарий
CreateDB_Insert_Data.sql. Затем на панели инструментов нажмите кнопку
Новый запрос (New Query), и откройте новое пустое Окно запросов (Query),
предназначенное для формирования нового сценария
StoredProcedures_Functions.sql. Сделайте активной созданную базу данных
TRADE_ХХХ:
USE TRADE_ХХХ
GO
82
SET @Code = 10
SET @Name = ’MS SQL Server’
SET @Price = 299.99
Команда SELECT отличается от команды SET тем, что позволяет присвоить
значения сразу нескольким переменным:
SELECT @Code = 10, @Name = ’MS SQL Server’, @Price = 299.99
Для вывода (на экран монитора) значений переменных также используется
команда SELECT:
SELECT @Code, @Name, @Price
При выводе значений переменных можно снабдить их содержательными
именами. При этом идентификаторы, содержащие недопустимые символы,
такие как ' ' (пробел), '%', '*' и др., должны быть заключены в квадратные
скобки:
SELECT @Code AS [Product Code], @Name AS ProductName, @Price AS
[Product Price]
Связку AS можно при желании опускать:
SELECT @Code [Product Code], @Name ProductName, @Price [Product
Price]
GO
Замечание. Рассмотренные выше переменные являются локальными, т.е.
существуют внутри текущего пакета команд (заканчивающегося командой GO)
и уничтожаются при выходе из него, поэтому все их нужно выполнять
совместно в рамках единого пакета. В отличие от них, глобальные переменные
существуют в контексте всего соединения и записываются не с одним, а с
двумя лидирующими символами @.
Переменным можно присваивать значения полей из таблиц базы данных.
Например:
DECLARE @Code INT, @Name VARCHAR(50), @Price MONEY
SELECT @Code = ProductID, @Name = ProductName, @Price = Price FROM
Products WHERE Currency IN ('USD', 'EUR')
SELECT @Code AS [Product Code], @Name AS ProductName, @Price AS
[Product Price]
GO
Здесь переменные @Code, @Name, @Price получили значения
соответствующих полей последней строки набора данных, выбираемого
командой SELECT (сам набор данных на экран не выводится).
83
1. Если необходимо сохранить в переменных сначала сведения о
продукте с наибольшей, а затем - с наименьшей ценой применительно к кодам
валют USD и EUR, то необходимо выполнить следующую последовательность
команд:
DECLARE @Code INT, @Name VARCHAR(50), @Price MONEY
-- Выборка данных из таблицы Products с сортировкой строк
-- по столбцу Price в порядке возрастания
SELECT @Code = ProductID, @Name = ProductName, @Price = Price
FROM Products
WHERE Cirrency IN ('USD', 'EUR')
ORDER BY Price
2. Вывод данных о товаре с наибольшей ценой
SELECT @Код AS [Product Code], @Name AS ProductName, @Price AS [MAX
Product Price]
-- Выборка данных из таблицы Products с сортировкой строк по столбцу
-- Price в порядке убывания
SELECT @Код = ProductID, @Name = ProductName, @Price = Price
FROM Products
WHERE КодВалюты IN ('USD', 'EUR')
ORDER BY Price DESC
-- DESC указывает на убывающий порядок сортировки
-- Вывод данных о товаре с наименьшей ценой
SELECT @Код AS [Код Productsа], @Name AS ProductName, @Price AS
[MIN Product Price]
GO
3. Можно определить среднюю цену товаров, которые проданы за евро и
доллары (Рисунок 87):
84
и доллары.
4. Необходимо определить наименование товара, по которому был
наибольший спрос за последние N дней. Один из вариантов решения этой
задачи заключается в выполнении следующей последовательности шагов.
Объявляются переменные, требуемые для решения данной задачи:
DECLARE @Name VARCHAR(50), @Code INT
DECLARE @Quantity NUMERIC(12,3), @N INT
Задается значение интервала в днях:
SET @N = 300
Выполняется выборка данных с группировкой по кодам товаров и
подсчетом для каждой группы суммарного количества заказанного товара (т.е.
величины спроса). При этом результирующий набор данных будет
отсортирован в порядке возрастания величины спроса и, следовательно,
последняя его строка будет отображать товар с наибольшим спросом. Результат
выполнения этой команды на экран не выдается, а вместо этого данные
последней строки сохраняются в переменных @Code, @Name и @Quantity:
SELECT @Code = ProductID, @Name = ProductName,
@Quantity = SUM(Quantity)
FROM Orders
WHERE OrderDate BETWEEN GetDate()-@N AND GetDate()
GROUP BY ProductID, ProductName
ORDER BY SUM(Quantity)
По найденному в предыдущем пункте коду товара с наибольшим
спросом находится соответствующее ему наименование товара:
SELECT @Name = ProductName FROM Products
WHERE ProductID = @Code
Выдается найденный результат на экран:
SELECT @Name AS [Наименование товара], @Quantity AS [Итоговое
количество], @N AS [Временной интервал]
GO
Замечание. Все команды, рассмотренные на этих пяти шагах,
выполняются в рамках одного пакета (поясняющий текст нужно удалить или
закомментировать) ().
85
Рисунок 88. Определение наименования товара, по которому был
наибольший спрос за последние N дней.
Программный код на языке Transact-SQL может включать в себя также
битовые и логические операторы, операторы перехода (GOTO) и приостановки
(WAITFOR), команды организации ветвлений (IF, CASE) и циклов (WHILE),
операторные скобки (BEGIN...END) и др.
86
Measure CHAR(10) NULL
)
INSERT #Goods
SELECT ProductID, ProductName, Measure
FROM Products
87
Процедуры вызываются командой EXEC[UTE], в том числе из процедур,
функций и других типов программных объектов. При вызове процедуры можно
не указывать значения тех параметров, для которых заданы значения по
умолчанию (можно также использовать зарезервированное слово DEDAULT).
Однако при этом нужно придерживаться следующего правила: если значение
какого-либо параметра не указывается (и нет слова DEDAULT), то значения
последующих параметров нужно обязательно сопровождать указанием имен
этих параметров (@parameter = value или @parameter = @variable). Такие
поименованные параметры можно задавать в произвольном порядке.
Необходимость существования хранимых процедур диктуется тем, что не
всякий результат можно получить с помощью одного запроса. Хранимые
процедуры могут содержать большое число команд, а вызываться из
клиентской программы всего одной строкой, что существенно снижает сетевой
трафик. Кроме того, модификация хранимой процедуры приводит к тому, что
сразу все клиентские приложения будут работать с новой редакцией
процедуры.
Синтаксис команды создания хранимой процедуры:
88
2. Выбор всех регионов конкретной страны:
CREATE PROCEDURE pr_LocationsData;2
@Country VARCHAR(20) = 'Беларусь'
AS
SELECT *
FROM Locations
WHERE Country = @Country
GO
Проверка работы хранимой процедуры pr_LocationsData;2
-- выбираются регионы Беларуси
EXEC pr_LocationsData;2
-- выбираются регионы России
EXEC pr_LocationsData;2 'Россия'
-- выбираются регионы Украины
EXEC pr_LocationsData;2 'Украина'
GO
3. Выбор регионов, связанных со страной и/или городом
CREATE PROCEDURE pr_LocationsData;3
@Country VARCHAR(20) = 'Беларусь',
@City VARCHAR(20) = NULL
AS
IF @Country IS NOT NULL
BEGIN
IF @City IS NOT NULL
SELECT *FROM Locations
WHERE Country = @Country AND City = @City
ELSE
SELECT *
FROM Locations
WHERE Country = @Country
END
ELSE
IF @City IS NOT NULL
SELECT *
89
FROM Locations
WHERE City = @City
GO
Проверка работы хранимой процедуры pr_LocationsData;3
EXEC pr_LocationsData;3
EXEC pr_LocationsData;3 @City = 'Минск'
EXEC pr_LocationsData;3 DEFAULT, 'Воложин'
EXEC pr_LocationsData;3 'Россия'
EXEC pr_LocationsData;3 NULL, 'Львов'
GO
4. Вставка новой строки в таблицу Currency
CREATE PROCEDURE pr_CurrencyInsertion
@Code CHAR(3),
@Name VARCHAR(30),
@Rate SMALLMONEY = 1000
AS
INSERT INTO Currency
VALUES(@Code, @Name, @Rate)
GO
Проверка работы хранимой процедуры pr_CurrencyInsertion.
EXEC pr_CurrencyInsertion'WWW', 'Валюта страны W'
EXEC pr_CurrencyInsertion'XXX', 'Валюта страны X', 1
EXEC pr_CurrencyInsertion'YYY', 'Валюта страны Y', @Rate=500
EXEC pr_CurrencyInsertion'ZZZ', 'Валюта страны Z', 2500
---------------------------
SELECT * FROM Currency
GO
90
IF @Code IS NOT NULL
SELECT @Rate = Rate
FROM Currency
WHERE CurrencyID = @Code
ELSE
SELECT @Rate = Rate
FROM Currency
WHERE CurrencyID = 'USD'
GO
Проверка работы хранимой процедуры pr_CurrencyRateChoice. Для
каждой проверки создайте новый запрос.
DECLARE @Code CHAR(3), @Course SMALLMONEY
SET @Code = 'EUR'
EXEC pr_CurrencyRateChoice @Code, @Course OUTPUT
SELECT @Code AS [Code валюты], @Course AS [Курс валюты]
-------------------------------------
EXEC pr_CurrencyRateChoice NULL, @Course OUTPUT
SET @Code = 'USD'
SELECT @Code AS [Code валюты], @Course AS [Курс валюты]
GO
6. Выбор имени клиента и ФИО руководителя по коду клиента.
CREATE PROCEDURE рr_ClientData;1
@Code INT,
@ClientName VARCHAR(40) OUTPUT,
@FullName VARCHAR(60) OUTPUT
AS
SELECT @ClientName = ClientName, @FullName = HeadFullName
FROM Clients
WHERE ClientID = @Code
GO
Проверка работы хранимой процедуры рr_ClientData;1
DECLARE @Code INT, @ClientName VARCHAR(40), @FullName VARCHAR(60)
SET @Code = 5
EXEC рr_ClientData;1 @Code, @ClientName OUTPUT, @FullName OUTPUT
91
SELECT @ClientName AS [Имя клиента], @FullName AS [ФИО
руководителя]
GO
7. Выбор данных о клиенте по любому из трех параметров
CREATE PROCEDURE рr_ClientData;2
@Code INT = NULL OUTPUT,
@ClientName VARCHAR(40) = NULL OUTPUT,
@FullName VARCHAR(60) = NULL OUTPUT
AS
IF @Code IS NOT NULL
SELECT @ClientName = ClientName, @FullName = HeadFullName
FROM Clients
WHERE ClientID = @Code
ELSE
IF @ClientName IS NOT NULL
SELECT @Code = ClientID, @FullName = HeadFullName
FROM Clients
WHERE ClientName = @ClientName
ELSE
IF @FullName IS NOT NULL
SELECT @Code = ClientID, @ClientName =
ClientName
FROM Clients
WHERE HeadFullName = @FullName
GO
Проверка работы хранимой процедуры рr_ClientData;2.
DECLARE @Code INT, @Name VARCHAR(40), @FIO VARCHAR(60)
SET @Code = 1
EXEC рr_ClientData;2 @Code, @Name OUTPUT, @FIO OUTPUT
SELECT @Code AS [Code Clientsа], @Name AS [Name Clientsа],
@FIO AS [ФИО руководителя]
---------------------------------------
SET @Code = NULL
SET @Name = 'ИП "Темп"'
92
EXEC рr_ClientData;2 @Code OUTPUT, @Name, @FIO OUTPUT
SELECT @Code AS [Code Clientsа], @Name AS [Name Clientsа],
@FIO AS [ФИО руководителя]
---------------------------------------------
SET @Code = NULL
SET @Name = NULL
SET @FIO = 'Прокушев Станислав Игоревич'
EXEC рr_ClientData;2 @Code OUTPUT, @Name OUTPUT, @FIO
SELECT @Code AS [Code Clientsа], @Name AS [Name Clientsа],
@FIO AS [ФИО руководителя]
GO
8. Процедура создания и наполнения данными глобальной временной
таблицы
CREATE PROCEDURE pr_LocationsCopy
@Country VARCHAR(20) = 'Беларусь',
@City VARCHAR(20) = 'Минск'
AS
IF @Country IS NOT NULL
IF @City IS NOT NULL
SELECT *
INTO ##Locations
FROM Locations
WHERE Country = @Country AND City = @City
GO
Проверка работы хранимой процедуры pr_LocationsCopy.
EXEC pr_LocationsCopy
SELECT * FROM ##Locations
93
SELECT * FROM ##Locations
94
Задание 5. Удаление хранимой процедуры
95
функция создается без входных параметров нужно написать пустые скобки
после имени функции.
Команда создания пользовательской функции имеет следующий
синтаксис:
--Transact-SQL Scalar Function Syntax
CREATE FUNCTION [schema_name.] function_name
([{@parameter_name [AS] [type_schema_name.] parameter_data_type
[= default] [READONLY]}
[,...n]
]
)
RETURNS return_data_type
[WITH <function_option> [,...n] ]
[AS]
BEGIN
function_body
RETURN scalar_expression
END
[;]
96
Проверка работы функции fn_CurrencyRateChoice (Рисунок 89):
DECLARE @Code CHAR(3)
SET @Code = 'USD'
SELECT @Code AS [Код валюты],
dbo.fn_CurrencyRateChoice(@Code) AS [Курс валюты]
97
RETURN [(]select_stmt[)]
[;]
98
[= default ] [READONLY]}
[ ,...n]
]
)
RETURNS @return_variable TABLE <table_type_definition>
[ WITH <function_option> [ ,...n ]
[AS]
BEGIN
function_body
RETURN
END
[;]
99
SELECT LocationID, Country, Region, City
FROM Locations
WHERE Country = @Country
-- Заносим данные в столбец RegionalCenter переменной @rowset
UPDATE @rowset SET RegionalCenter= 1 WHERE Region = ''
-- Заносим данные в результирующую переменную @CountryRegions типа
-- таблица, т.к. локальная переменная @rowset после выхода из
функции
-- автоматически уничтожается
INSERT @CountryRegions
SELECT LocationID, Country, City, RegionalCenter
FROM @rowset
RETURN
END
GO
Проверка работы функции fn_RegionalCenters (Рисунок 91):
SELECT * FROM fn_RegionalCenters('Беларусь')
SELECT * FROM fn_RegionalCenters('Россия')
GO
100
Задания для самостоятельного выполнения
101
иметь один входной параметр (@FullName).
Усложненный вариант. Расширьте возможности функции таким образом,
чтобы была допустима исходная строка (задаваемая параметром @FullName),
содержащая не один, а несколько пробелов между фамилией и именем или
между именем и отчеством, а также допускающая наличие лидирующих
пробелов перед фамилией.
102
которых значение столбца [CostBYN] будет меньше, чем значение входного
параметра функции. В результате будет получена таблица, которую и должна
возвращать данная пользовательская функция. Эта функция должна иметь один
входной параметр граница стоимости (@CostBoundary).
103
Лабораторная работа № 7.
Разработка курсоров и триггеров
Подготовительные действия
1. Запуститеутилиту SQL Server Management Studio, в окне
Обозреватель объектов (Object Explorer) в древовидной структуре раскройте
папку Базы данных (Databases).
2. С помощью команды меню File - Open - File загрузите сценарий из
файла D:\FIO\TRADE_XXX\CreateDB_Insert_Data.sql в Окно запросов
(Query).
3. Выполните сценарий, нажав на панели инструментов кнопку
Выполнить (Execute) (или клавишу F5). В результате будет создана база данных
TRADE_ХХХ.
4. Обновите данные в окне Обозреватель объектов (Object Explorer).
Для этого используйте команду Обновить (Refresh) в контекстном меню папки
Базы данных (Databases) или соответствующую кнопку в верхней части окна.
В результате база данных TRADE_ХХХ станет видимой в окне Обозреватель
объектов (Object Explorer).
5. Закройте Окно запросов (Query), содержащее сценарий
CreateDB_Insert_Data.sql. Затем на панели инструментов нажмите кнопку
Новый запрос (New Query), и откройте новое пустое Окно запросов (Query),
предназначенное для формирования нового сценария Cursors_Triggers.sql.
Сделайте активной созданную базу данных TRADE_ХХХ:
USE TRADE_ХХХ
GO
Теоретические сведения
104
открытия. В дальнейшем содержимое такого курсора не меняется и хранится в
системной базе данных tempdb.
Динамические курсоры каждый раз обновляются при обращении к его
строкам (т.е. обращение к другой строке формирует набор данных заново путем
выполнения команды SELECT). При работе с динамическими курсорами
пользователи могут вносить изменения в строки набора данных с помощью
команд UPDATE, INSERT, DELETE. Однако каждая такая команда за один раз
может работать только с одной строкой.
Курсоры бывают последовательные (Forward-only) и прокручиваемые
(Scrollable). Последовательные курсоры обеспечивают только
последовательное считывание строк в прямом направлении, т.е. начиная с
первой строки и заканчивая последней.
Прокручиваемые курсоры обеспечивают как последовательное считывание
строк в обоих направлениях (прямом и обратном), так и обращение к
произвольной строке набора данных. Однако они работают медленнее, чем
последовательные курсоры.
Весь процесс работы с курсором включает в себя пять этапов.
1. Объявление курсора. Подразумевает указание его имени и запроса
SELECT, который будет использоваться для формирования набора данных,
связанного с курсором. Синтаксис 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, в результате чего создается
связанный с курсором набор данных. Команда имеет следующий синтаксис:
OPEN{{[GLOBAL]cursor_name}|cursor_variable_name}
3. Манипуляции со строками курсора. После того, как курсор открыт,
можно приступать к выборке данных из этого курсора, а если тип курсора
позволяет, то и к операциям обновления и удаления данных.
Команда считывания строки данных из курсора имеет следующий
синтаксис:
105
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, имеющей следующий синтаксис:
UPDATE table_name
SET {column_name = {expression|DEFAULT|NULL}}[,...n]
WHERE CURRENT OF cursor_name
Изменения, внесенные этой командой, будут касаться только текущей
строки курсора. За одну операцию обновления данных допускается изменение
значений полей, относящихся к одной таблице. Если курсор строится на основе
нескольких таблиц и необходимо изменить все значения строки курсора, то для
этого придется выполнить несколько команд UPDATE.
Кроме того, допускается изменение любых столбцов таблицы, в том числе
и не входящих в набор данных курсора.
Удаление данных посредством курсора выполняется с помощью команды
DELETE, имеющей следующий синтаксис:
DELETE [FROM] table_name
106
WHERE CURRENT OF cursor_name
При выполнении этой команды происходит удаление строки указанной
таблицы, связанной с текущей строкой курсора. Если курсор строится на
основе нескольких таблиц, то для удаления данных из этих таблиц необходимо
выполнить команду DELETE отдельно для каждой таблицы.
4. Закрытие курсора. После того, как были выполнены все
необходимые манипуляции со строками курсора, его можно закрыть. Это
приводит к высвобождению выделенных для него ресурсов (например,
пространства в системной базе данных tempdb) и снятию блокировок, если они
были установлены в процессе работы курсора. Команда имеет следующий
синтаксис:
CLOSE {{[GLOBAL]cursor_name}|cursor_variable_name}
5. Освобождение курсора. Закрытый курсор может быть удален, что
подразумевает удаление из оперативной памяти описания курсора как объекта.
Если курсор закрыт, но не удален, он может быть повторно открыт для
использования. При этом в него будет помещен новый набор данных.
Команда освобождения курсора имеет следующий синтаксис:
DEALLOCATE {{[GLOBAL]cursor_name}|@cursor_variable_name}
107
IF @IntervalStart IS NULL
SET @IntervalStart = CAST(GETDATE() - 100 AS DATE)
IF @IntervalEnd IS NULL
SET @IntervalEnd = CAST(GETDATE() AS DATE)
-- выполняем начальную установку
SET @CostBYR = 0
-- объявляем локальную переменную @СтоимостьЗаказа
DECLARE @OrderCost MONEY
-- объявляем курсор myCursor. При этом набор данных, связанный
-- с курсором, будет содержать всего один столбец
DECLARE myCursor CURSOR LOCAL STATIC FOR
SELECT Orders.Quantity * Products.Price * Currency.Rate FROM Orders
INNER JOIN Products ON Orders.Product = Products.ProductID
INNER JOIN Currency ON Products.Currency = Currency.CurrencyID
WHERE Orders.OrderDate BETWEEN @IntervalStart AND
@IntervalEnd
-- открываем курсор
OPEN myCursor
-- заносим в курсор значение первой строки набора данных и
-- считываем это значение в переменную, которая хранит стоимость заказа @OrderCost
FETCH FIRST FROM myCursor INTO @OrderCost
-- организуем цикл, необходимый для последовательной работы с остальными строками
-- набора данных с целью получения суммы стоимостей заказов в национальной валюте
WHILE @@FETCH_STATUS = 0
BEGIN
SET @CostBYR = @CostBYR + @OrderCost
FETCH NEXT FROM myCursor INTO @OrderCost
END
-- Опцию NEXT (переход к следующей строке) в команде FETCH можно -- опускать,
--т. к. она подразумевается по умолчанию
-- закрываем курсор
CLOSE myCursor
-- освобождаем курсор
DEALLOCATE myCursor
GO
108
Проверка работы хранимой процедуры pr_COST_BYN_Interval.
Значения для переменных @IntervalStart, @IntervalEnd,
определяющих дату начала и дату завершения временного интервала при
вызове функции не определены, поэтому они получат значения, определенные
в теле функции. Это будет интервал, начинающийся за 100 дней от текущей
даты и завершающийся текущей датой (Рисунок 92).
109
Автоматическое срабатывание триггеров в ответ на изменения табличных
данных позволяет использовать их, например, для реализации сложных
алгоритмов проверки данных, для обеспечения правильности и достоверности
данных, для создания сложного значения по умолчанию (вычисляя его с
помощью значений других столбцов и функций языка Transact-SQL), для
обеспечения нестандартной ссылочной целостности, поддержания которой
обычными средствами SQL Server невозможно и т.д.
Использование триггеров превращает сервер из пассивного наблюдателя за
происходящими изменениями данных, в систему, оперативно реагирующую на
такие изменения. Таким образом, правила, в соответствие с которыми
осуществляются активные действия сервера, определяются триггерами (эти
правила называют также бизнес-правилами).
В MS SQL Server существует два вида триггеров:
AFTER-триггеры, которые запускаются после успешного выполнения
команд, связанных с изменением табличных данных. Как команда, так и
триггер реализуются в рамках одной и той же транзакции. Поэтому откат при
выполнении триггера приведет и к откату команды, вызвавшей его запуск.
AFTER-триггеры широко используются и полезны, например, в тех случаях,
когда при модификации строк необходимо сравнивать исходные значения
полей с их новыми значениями. С каждой таблицей может быть связано не
более трех AFTER-триггеров (по одному для каждой из команд INSERT,
UPDATE, DELETE).
INSTEAD OF-триггеры, тело которых выполняется вместо операций
вставки, обновления и удаления строк, вызвавших запуск триггера этого вида.
Синтаксис команды создания триггера:
CREATE TRIGGER trigger_name
ON {table}
[WITH ENCRYPTION]
{
{FOR [{AFTER|INSTEAD OF}]
{[DELETE][,][INSERT][,][UPDATE]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS
[{IF UPDATE (column)
[{AND|OR} UPDATE (column)]
[...n]
110
|IF(COLUMNS_UPDATED())
{comparison operator}
}]
sql statement[...n]
}
}
В этой команде, в частности, присутствуют функции UPDATE(column) и
COLUMNS_UPDATED(), используемые для определения того, какой столбец или
группу столбцов пользователь пытается изменить. Кроме того, всегда можно
получить полную информацию об изменениях, которые пытается произвести
пользователь. Эту информацию дают таблицы inserted и deleted, которые
автоматически создаются сервером при запуске триггера. Содержимое этих
таблиц зависит от команды, вызвавшей запуск триггера:
Команда INSERT. В таблице inserted будут содержаться все строки,
которые пользователь пытается Вставьте в таблицу. Таблица deleted будет
пуста.
• Команда DELETE. В таблице deleted будут содержаться все строки,
которые пользователь пытается удалить. Таблица inserted будет пуста.
• Команда UPDATE. В таблице deleted будут содержаться все строки,
которые пользователь пытается изменить. В таблице inserted указываются
строки, которые будут внесены в таблицу вместо соответствующих строк
таблицы deleted.
Для внесения изменений в текст существующего триггера используется та
же команда, что и для его создания, с тем лишь отличием, что вместо
зарезервированного слова CREATE используется слово ALTER.
Для удаления триггера используется команда, имеющая следующий
синтаксис:
DROP TRIGGER {trigger} [,...n]
В кодах триггеров часто используется команда ROLLBACK TRAN (отмена или
откат транзакции). Кроме нее в программах на языке Transact-SQL
используются также команды BEGIN TRAN (старт транзакции), COMMIT TRAN
(подтверждение транзакции) и SAVE TRAN (создание точки сохранения
транзакции).
Например, отладку какой-нибудь команды или фрагмента программы,
вносящих изменения в данные, можно начать со старта транзакции, а в самом
конце выполнить команду ROLLBACK TRAN, восстановив тем самым
первоначальные значения измененных данных (Рисунок 94).
111
Рисунок 94. Пример работы команды ROLLBACK TRAN.
Рассмотрим два примера по созданию триггеров.
Пример 1. Запретим с помощью триггера возможность модификации
данных в столбце OrderDate таблицы Orders.
CREATE TRIGGER tr_NoModify_OrderDate
ON Orders
FOR UPDATE AS
IF UPDATE(OrderDate)
BEGIN
PRINT 'Обновление столбца OrderDate запрещено'
ROLLBACK TRAN -- откат транзакции
END
GO
Замечание. Команда PRINT в отличие от команды SELECT выводит
сообщения не на панель Results, а не на панель Messages окна Query утилиты
SQL Server Management Studio.
Теперь, несмотря на то, что вы являетесь владельцем базы данных, вы уже
112
не можете редактировать значения столбца OrderDate в таблице Orders:
113
Рисунок 96. Добавление новых столбцов в таблицу Orders.
Создадим триггер для таблицы Products, срабатывающий при любом
изменении цены товара и корректирующий в таблице Orders значения полей
Cost и CostBYN в тех строках, которые соответствуют товару с изменившейся
ценой:
CREATE TRIGGER tr_ProductPrice
ON Products
FOR UPDATE AS
IF UPDATE(Price)
BEGIN
-- объявляем локальные переменные
DECLARE @ProductCode INT, @Price MONEY, @PriceBYN MONEY
-- присваиваем значения локальным переменным, выбирая эти значения из таблицы inserted
SELECT @ProductCode = inserted.ProductID,
@Price = inserted.Price, @PriceBYN = inserted.Price * Currency.Rate
FROM inserteD INNER JOIN Currency
ON inserted.Currency = Currency.CurrencyID
-- обновляем значения стоимостей в таблице Orders
UPDATE Orders
SET Cost = Quantity * @Price,
CostBYN = Quantity * @PriceBYN
WHERE Product = @ProductCode
END
GO
Проверим работу созданного триггера. Для этого изменим цену товара с
кодом 111 (Рисунок 97).
114
Рисунок 97. Проверка работы триггера tr_ProductPrice.
Однако данный триггер обладает тем недостатком, что отслеживает
изменение цены лишь одного товара, даже если были одновременно изменены
цены сразу у нескольких товаров. Убедимся в этом, изменив цены сразу для
всех товаров ().
115
Рисунок 98. Триггер tr_ProductPrice изменяет стоимость только одного
товара, первого по списку в таблице Products.
Устраним указанный выше недостаток путем внесения изменения в код
триггера:
CREATE TRIGGER tr_ProductsPrice_AllGoods
ON Products
FOR UPDATE AS
IF UPDATE(Price)
BEGIN
DECLARE @ProductCode INT, @Price MONEY, @PriceBYN MONEY
-- объявляем курсор myCursor. Набор данных, связанный с курсором и
-- построенный на основе таблицы inserted, будет содержать три столбца
DECLARE myCursor CURSOR LOCAL STATIC FOR
SELECT inserted.ProductID, inserted.Price,
inserted.Price * Currency.Rate
FROM inserteD INNER JOIN Currency
116
ON inserted.Currency = Currency.CurrencyID
-- открываем курсор
OPEN myCursor
-- заносим в курсор данные первой строки набора данных и считываем
-- значения ее полей в переменные @ProductCode, @Price, @PriceBYN
FETCH FIRST FROM myCursor INTO @ProductCode, @Price, @PriceBYN
-- организуем цикл, необходимый для последовательной работы с остальными
-- строками набора данных с целью обновления стоимостей в таблице Orders
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Orders
SET Cost = Quantity * @Price,
CostBYN = Quantity * @PriceBYN
WHERE Product = @ProductCode
FETCH NEXT FROM myCursor INTO @ProductCode, @Price, @PriceBYN
END
-- закрываем курсор
CLOSE myCursor
-- освобождаем курсор
DEALLOCATE myCursor
END
GO
Проверим работу триггера, снова изменив цены сразу для всех товаров,
после чего убедимся, что пересчитались стоимости всех заказов,
представленных строками таблицы Orders ().
117
Рисунок 99. Проверка работы триггера tr_ProductsPrice_AllGoods
118
Задание 4. Разработка хранимой процедуры
pr_Country_Clients_Suppliers
119
Products.
Усложненный вариант. Таблица Protocol должна включать в себя еще
один столбец ProductID, в котором указываются коды товаров, фигурирующие
во вставленных, обновленных или удаленных строках.
120
Лабораторная работа № 8.
Администрирование БД в MS SQL Server
Теоретические сведения
121
понятиями:
• аутентификация;
• учетная запись;
• встроенные роли сервера.
На уровне базы данных применяются следующие понятия;
• пользователь базы данных;
• фиксированная роль базы данных;
• пользовательская роль базы данных.
Режимы аутентификации
MS SQL Server предлагает два режима аутентификации пользователей:
• режим аутентификации средствами Windows;
• смешанный режим аутентификации (Windows NT Authentication and
SQL Server Authentication).
122
нажмите кнопку Дополнительно (Additionally), в следующем окне нажмите
кнопку Поиск (Search) и выберите из списка существующую учетную запись
ОС Windows с именем ComputerName/User1 и вставьте ее в поле ввода Имя
входа (Login name). В качестве базы данных по умолчанию выберите
TRADE_ХХХ (Рисунок 100).
123
Рисунок 101. Назначение фиксированной роли сервера dbcreator
На странице Сопоставление пользователей (Database Access) установите
в верхнем списке флажок TRADE_ХХХ, а в нижнем списке - флажок
db_accessadmin (Рисунок 102), разрешив тем самым пользователю с данной
учетной записью управлять добавлением или удалением пользователей в базе
данных TRADE_ХХХ (другими словами, включите данную учетную запись в
фиксированную роль db_accessadmin базы данных TRADE_ХХХ).
124
Рисунок 102. Включение учетной записи в фиксированную роль
db_accessadmin базы данных TRADE_ХХХ.
Завершите создание регистрационной записи ComputerName/User1
щелчком на кнопке OK.
Аналогичным образом создайте для SQL Server регистрационные записи
ComputerName/User2, ComputerName/User3, ComputerName/User4 при этом,
однако, не включайте соответствующие им учетные записи Windows ни в одну
из фиксированных ролей сервера и ни в одну из фиксированных ролей базы
данных TRADE_ХХХ (однако на странице Database Access флажок TRADE_ХХХ в
верхнем списке должен быть установлен).
Примечание. Регистрационные записи SQL Server определяют перечень
тех пользователей и групп пользователей операционной системы OC Windows,
которые будут иметь доступ к данному SQL Server.
4. На панели Инспектор объектов (Object Explorer) раскройте элемент
TRADE_ХХХ и далее подчиненную ему папку Security. Затем выберите
125
появившуюся папку Пользователи (Users) и убедитесь, что сервер создал
новых пользователей ComputerName/User2, ComputerName/User3,
ComputerName/User4 (другими словами, отобразил учетные записи OC
Windows ComputerName/User2, ComputerName/User3, ComputerName/User4
пользователей базы данных TRADE_ХХХ с такими же именами).
5. Для базы данных TRADE_ХХХ создайте три пользовательские роли
(Рисунок 103) (на уровне роли можно легко менять привилегии пользователей-
членов роли). Для этого в контекстном меню папки Безопасность (Security) -
Роли (Roles) базы данных TRADE_ХХХ, выберите команду Создать
(New) - Создать роль базы данных (New Database Role) и откройте окно Роль
базы данных – Создание (Database Role – New).
126
104). Далее нажмите кнопку Добавить (Add), затем кнопку Поиск (Browse) и
установите флажок в строке ComputerName/User1 (Рисунок 105), завершая
выбор двумя нажатиями кнопки ОК. После этого закройте окно Роль базы
данных – Создание (Database Role – New) с помощью кнопки ОК.
127
Рисунок 106. Создание пользовательской роли с именем Бухгалтер
Далее создайте пользовательскую роль с именем Экономист, проставляя
флажки в строках ComputerName/User3 и Главный бухгалтер.
Примечание! В SQL Server любой отдельный пользователь
(представляющий, в свою очередь, одного или группу пользователей ОС
Windows), а также любая отдельная роль может входить в состав нескольких
ролей. В свою очередь каждая роль может включать в качестве своих членов
несколько пользователей и ролей. В результате пользователи наследуют
привилегии, установленные во всех ролях, в которые они входят (прямо, либо
косвенно через другие роли).
В нашем случае пользователь ComputerName/User1, помимо привилегий
роли Главный бухгалтер, будет обладать также привилегиями ролей
Бухгалтер и Экономист, в то время как пользователь ComputerName/User2
будет обладать только привилегиями роли Бухгалтер, а пользователь
ComputerName/User3 - только привилегиями роли Экономист.
128
Примечание 2. В любой базе данных автоматически создается
пользователь с именем dbo (database owner), являющийся ее владельцем, также,
как и все члены фиксированной роли базы данных db_owner. Пользователь dbo
имеет абсолютные права по управлению базой данных и его нельзя удалить.
Кроме того, пользователь dbo включен в роль db_owner и не может быть
удален из нее.
Примечание З. Имеется фиксированная роль базы данных public со
специальными функциями. В эту роль нельзя включать пользователей, т.к.
любой пользователь, созданный в базе данных, автоматически включается в
роль public, и нет никакой возможности исключить его из этой роли. Роль
public предназначена для предоставления привилегий по умолчанию всем
пользователям, имеющим доступ к данной базе данных.
7. Задайте привилегии для пользовательских ролей базы данных
TRADE_ХХХ. Для этого в контекстном меню роли Главный бухгалтер выберите
команду Свойства (Properties) (и откройте окно Свойства ролей базы данных
(Database Role Properties) – Главный бухгалтер.
Перейдите на страницу Защищаемые объекты (Protected objects),
выберите через кнопку Поиск (Browse) флажок Определенные объекты...,
нажмите кнопку ОК, в окне поставьте галочки около Таблицы и
Представления, далее нажмите кнопку Обзор, выделите все таблицы БД
TRADE_ХХХ и представление OrdersCost (Рисунок 107).
129
Рисунок 107. Определение привилегий для пользовательских ролей БД
Для таблицы Currency установите привилегии Выборка (Select), Вставка
(Insert), Обновление (Update), Удаление (Delete). Для таблицы Orders
установите привилегию Обновление (Update), а для представления
OrdersCost - привилегию Выборка (Select). Для каждой из таблиц Clients,
Suppliers, Products установите привилегии Обновление (Update) и Удаление
(Delete). Далее, выбрав таблицу Orders, выбрав разрешение Обновление
(Update) нажмите кнопку Разрешение на доступ к столбцу (Column
Permissions)) и в появившемся окне запретите привилегию Обновление
(Update) для столбцов OrderDate и DeliveryDate (Рисунок 108).
130
Рисунок 108. Разрешения на доступ к столбцам
По аналогии задайте привилегии для других пользовательских ролей.
Для роли Бухгалтер каждая из таблиц Orders, Clients должна иметь
привилегии Выборка (Select) и Вставка (Insert).
Для роли Экономист каждая из таблиц Suppliers, Products должна иметь
привилегии Выборка (Select) и Вставка (Insert)..
Кроме того, для роли public таблица Locations должна иметь привилегии
Выборка (Select), Вставка (Insert), Обновление (Update), Удаление (Delete).
Примечание. Запрещение привилегии имеет более высокий приоритет,
чем предоставление привилегии. Если пользователю запрещена привилегия на
доступ к тому или иному объекту, то система безопасности SQL Server
гарантирует, что пользователь не будет иметь ее, даже если она была
предоставлена ему через членство в любой другой роли базы данных или
группе пользователей ОС Windows.
8. Завершите сеанс работы с ОС Windows под текущей учетной записью
и стартуйте сеанс под учетной записью ComputerName/User1.
При помощи пользовательского меню ОС Windows запустите утилиту SQL
Server Management Studio.
В этом случае будем говорить, что установлено соединение c сервером
базы данных от имени пользователя с учетной записью ComputerName/User1.
Убедитесь, что сейчас вы, применительно к базе данных TRADE_ХХХ,
обладаете привилегиями роли Главный бухгалтер, т.е. вы можете выполнять
131
все действия с таблицами Currency, Clients, Suppliers, Locations, Products, а
также все действия с таблицей Orders за исключением удаления строк и
обновления полей OrderDate и DeliveryDate. Также можно просматривать
данные представления OrdersCost.
Примечание. Ряд привилегий оказываются доступными благодаря
членству роли Главный бухгалтер в ролях Бухгалтера, Экономисты и public.
Кроме того, поскольку данная учетная запись является членом
фиксированной роли сервера dbcreators, то предоставлено право создавать
новые базы данных и их объекты.
Также предоставлено право управлять добавлением или удалением
пользователей в базе данных TRADE_ХХХ, поскольку данная учетная запись
включена в фиксированную роль db_accessadmin этой базы данных.
Убедитесь также, что отсутствует, например, право редактирования
структур таблиц в базе данных TRADE_ХХХ и право создавать в ней новые типы
данных.
9. Установите соединение c сервером базы данных от имени
пользователя с учетной записью ComputerName/User2.
Убедитесь, что сейчас вы, применительно к базе данных TRADE_ХХХ,
обладаете привилегиями роли Бухгалтер, т.е. вы можете просматривать данные
и вставлять новые строки только в таблицах Orders и Clients, однако обновлять
данные и удалять строки в этих таблицах вы не можете. Кроме того, вы можете
выполнять все действия с таблицей Locations (соответствующие привилегии
доступны через членство в роли public). К остальным таблицам, а также к
представлению OrdersCost, доступ оказывается запрещен. Также отсутствуют
права на выполнение и многих других действий.
10. Установите соединение c сервером базы данных от имени
пользователя с учетной записью ComputerName/User3.
Убедитесь, что сейчас вы, применительно к базе данных TRADE_ХХХ,
обладаете привилегиями роли Экономист, т.е. вы можете просматривать
данные и вставлять новые строки только в таблицах Suppliers и Products,
однако обновлять данные и удалять строки в этих таблицах вы не можете.
Кроме того, вы можете выполнять все действия с таблицей Locations
(соответствующие привилегии доступны через членство в роли public). К
остальным таблицам, а также к представлению OrdersCost, доступ оказывается
запрещен. Также отсутствуют права на выполнение и многих других действий.
11. Установите соединение c сервером базы данных от имени
пользователя с обычно используемой учетной записью.
Сейчас вы обладаете абсолютными правами по управлению базой данных
TRADE_ХХХ (например, возможна корректировка структур таблиц базы данных,
132
что невозможно в соединениях под учетными записями ComputerName/User1,
ComputerName/User2, ComputerName/User3). В этом можно легко убедиться,
если выберите на панели Инспектор объектов (Object Explorer) в дереве
структуры папку Безопасность (Security) - Пользователи (Users) базы данных
TRADE_ХХХ пользователя dbo. Затем в контекстном меню пользователя dbo
необходимо выполнить команду Свойства (Properties) и открыть окно
Пользователь базы данных – dbo (Database User Properties – dbo). Теперь
видно, что текущая учетная запись отображается в пользователя dbo, который в
свою очередь, является постоянным членом фиксированной роли базы данных
db_owner, которая и предоставляет все имеющиеся привилегии и возможности.
12. Отсоедините базу данных TRADE_ХХХ, выбрав в ее контекстном меню
команду Задачи (Tasks) - Отсоединить…(Detach Database). Убедитесь, что
база данных TRADE_ХХХ исчезла из папки Базы данных (Databases). Теперь
файлы этой базы данных можно, при необходимости, переместить в другую
папку на жестком диске или копировать на другой носитель данных.
133
Использование системной процедуры является устаревшим и не
поддерживается в современных версиях MS SQL Server. Для создания имени
входа на основе учетной записи домена Windows используйте следующую
команду:
CREATE LOGIN ИмяДомена\User1 FROM WINDOWS;
CREATE LOGIN ИмяДомена\User2 FROM WINDOWS;
CREATE LOGIN ИмяДомена\User3 FROM WINDOWS;
GO
Для удаления существующего имени входа используйте команду:
DROP LOGIN login_name
134
командой.
Для добавления к текущей базе данных пользователя базы данных для
имени входа Windows ’ИмяДомена\User1’, используется инструкция CREATE
USER. Новому пользователю присваивается имя User1.
CREATE USER User1 FOR LOGIN [ИмяДомена\User1];
GO
Удаление пользователя выполняется с помощью системной хранимой
процедуры, имеющей синтаксис:
sp_revokedbaccess [ @name_in_db = ] 'name'
Удаление пользователя из текущей базы данных с помощью команды DROP
USER:
DROP USER user_name
136
бухгалтер] WITH GRANT OPTION
GRANT UPDATE ON Orders TO [Главный бухгалтер] WITH GRANT OPTION
GRANT SELECT ON Запрос1 TO [Главный бухгалтер] WITH GRANT OPTION
GRANT UPDATE, DELETE ON Clients TO [Главный бухгалтер] WITH GRANT
OPTION
GRANT UPDATE, DELETE ON Поставщик TO [Главный бухгалтер] WITH GRANT
OPTION
GRANT UPDATE, DELETE ON Products TO [Главный бухгалтер] WITH GRANT
OPTION
GRANT SELECT, INSERT ON Orders TO Бухгалтер
GRANT SELECT, INSERT ON Clients TO Бухгалтер
GRANT SELECT, INSERT ON Поставщик TO Экономист
GRANT SELECT, INSERT ON Products TO Экономист
GRANT SELECT, INSERT, UPDATE, DELETE ON Locations TO public
GO
Примечание. С помощью ключевых слов WITH GRANT OPTION
пользователям, указанным с помощью строки TO security_account [,...n]
будет предоставлено право выдавать другим пользователям разрешения
доступа, аналогичные выданным им самим.
137
GO
Примечание. Кроме предоставления и запрещения прав доступа
существует еще и третье состояние - неявное отклонение доступа. Его можно
рассматривать как отмену ранее выданных полномочий, как по
предоставлению, так и запрету доступа. Если ранее пользователю не было
выдано никаких полномочий к объекту, то выполнять неявное отклонение
доступа бессмысленно, т.к. оно установлено по умолчанию. Неявное
отклонение доступа не мешает получить доступ к объекту на другом уровне,
например, через членство в некоторой роли. Для неявного отклонения доступа
используется команда REVOKE, имеющая следующий синтаксис:
REVOKE [GRANT OPTION FOR]
{ALL [PRIVILEGES ] | permission [ ,... n ]}
{
[( column [ ,...n ] ) ] ON { table | view}
|ON {table | view} [(column [ ,...n ])]
|ON {stored_procedure | extended_procedure}
} ON {user_defined_function}
138
Литература
Основная
1. Дейт, К. Дж. Введение в системы баз данных. - Пер. с англ. - 8-е изд. /
К. Дж. Дейт. – Москва: Вильямс, 2017. – 1327 с.
2. Коннолли, Т. Базы данных. Проектирование, реализация и
сопровождение. Теория и практика. - Пер. с англ. /Т. Коннолли, К. Бегг. –
Москва: Диалектика, 2017. 1440 с.
3. Кренке, Д. Теория и практика построения баз данных. - Пер. с
англ. - 9-е изд. / Д. Кренке. - СПб.: Питер, 2005. – 864 с.
4. Райордан, Р. М. Основы реляционных баз данных. - Пер. с англ. / Р.
М. Райордан. - – Москва: Русская редакция, 2001. – 384 с.
5. Бен-Ган, И. Microsoft SQL Server 2012. Основы T-SQL. - Пер. с англ. /
И. Бен-Ган. – Москва: ЭКСМО, 2015. – 400 с.
6. Петкович, Д. Microsoft SQL Server 2012/ Руководство для
начинающих. - Пер. с англ. /Д. Петкович. - СПб.: БХВ-Петербург, 2013. - 816 с.
7. Грофф, Дж. Р. SQL. Полное руководство. - Пер. с англ. / Дж. Р.Грофф,
П.Н.Вайнберг, Э. Дж.Оппелъ. – Москва: Вильямс, 2015. – 952 с.
8. Бутов, А.А. Базы данных. Лабораторный практикум для студентов
специальности «Информационные системы и технологии» БГУИР / А. А.
Бутов, И. Г. Орешко, Е. А. Шестаков. - Минск: БГУИР, 2009. - 108 с.
9. Астахова, И.Ф. СУБД: язык SQL в примерах и задачах. / И.Ф.
Астахова, В.В. Фертиков, В.М. Мельников, А.П. Толстобров. – Москва:
Физматлит, 2009. – 168 с.
10. Куликов, С.С. Работа с MySQL, SQL Server и Oracle в примерах.
Практическое пособие. / С. С. Куликов– Минск, УП «Бофф», 2016. – 556 с.
11. Карпова, И.П. Базы данных: Учебное пособие / И.П. Карпова. - СПб.:
Питер, 2013. - 240 c.
Дополнительная
12. Хомоненко, А. Д. Базы данных: Учебник для высших учебных
заведений / Под ред. проф. А. Д. Хомоненко. - 6-е изд., доп. - СПб.: КОРОНА-
Век, 2009. - 736 с.
13. Форта, Б. Освой самостоятельно SQL за 10 минут. 4-е изд. - Пер. с
англ. / Б. Форта. – Москва: Вильямс, 2014. – 288 с.
139
14. Кузнецов, С.Д. Основы современных баз данных [Электронный
ресурс] - Режим доступа: http://citforum.ru/database/osbd/contents.shtml. Дата
доступа: 05.11.2017.
15. Верников, Г. Основы методологии IDEF1X [Электронный ресурс] –
Режим доступа: http://www.citforum.ru/cfin/idef/idef1x.shtml. Дата доступа:
05.11.2017.
16. Агальцов, В.П. Базы данных. В 2-х т. Т. 2. Распределенные и
удаленные базы данных: Учебник / В.П. Агальцов. - Москва: ИД ФОРУМ, НИЦ
ИНФРА-М, 2013. - 272 c.
17. Агальцов, В.П. Базы данных. В 2-х т. Т. 1. Локальные базы данных:
Учебник / В.П. Агальцов. - Москва: ИД ФОРУМ, НИЦ ИНФРА-М, 2013. - 352
c.
18. Советов, Б.Я. Базы данных: теория и практика: Учебник для
бакалавров / Б.Я. Советов, В.В. Цехановский, В.Д. Чертовской. - Москва:
Юрайт, 2013. – 463 с.
19. Белодед, Н. И., Змитрович А. В., Обернихина И. С., Сасова Н. А.
Системы баз данных. / Н.И. Белодед, А.В. Змитрович, И.С. Обернихина,
Н.А. Сасова. - Минск: Академия управления при Президенте Республики
Беларусь. - 142 c.
20. Голицына, О. Л. Основы проектирования баз данных. / О.Л.
Голицына, Т.Л. Партыка, И.И. Попов - Москва: Форум, 2012. - 416 c.
21. Хаббард, Дж. Автоматизированное проектирование баз данных / Дж.
Хаббард. - Москва: Мир, 2014. - 296 c.
22. Редько, В.Н. Базы данных и информационные системы / В.Н. Редько,
И.А. Басараб. - Москва: Знание, 2015. - 371 c.
140
Послесловие
141