1. Вывести список сотрудников с указанной должностью.

advertisement
ИСПОЛЬЗОВАНИЕ СУБД
ДЛЯ СОЗДАНИЯ
ПРОГРАММНЫХ СИСТЕМ
И ИХ КОМПОНЕНТОВ
Методические указания
к практическим занятиям
для студентов направления подготовки 230100.68
«Информатика и вычислительная техника»
Составитель А. А. Будаева
ВЛАДИКАВКАЗ 2015
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«СЕВЕРО-КАВКАЗСКИЙ ГОРНО-МЕТАЛЛУРГИЧЕСКИЙ ИНСТИТУТ
(ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ)»
Кафедра автоматизированной обработки информации
ИСПОЛЬЗОВАНИЕ СУБД
ДЛЯ СОЗДАНИЯ
ПРОГРАММНЫХ СИСТЕМ
И ИХ КОМПОНЕНТОВ
Методические указания
к практическим занятиям
для студентов направления подготовки 230100.68
«Информатика и вычислительная техника»
Составитель А. А. Будаева
Допущено редакционно-издательским советом
Северо-Кавказского горно-металлургического
института (государственного технологического
университета).
Протокол заседания РИСа № 2 от 18.02.2014 г.
ВЛАДИКАВКАЗ 2015
1
УДК 004.65
ББК 32.973.26-0.18.2
Б90
Рецензент:
Кандидат технических наук, доцент СКГМИ (ГТУ) Даурова А. А.
Б90
Использование СУБД для создания программных систем
и их компонентов: Методические указания к практическим занятиям для студентов направления подготовки 230100.68 – «Информатика и вычислительная техника». Владикавказ: "Терек", 2015. –
58 с.
Методические указания содержат описание 6 практических занятий,
соответствующих рабочей программе по дисциплине «Использование
СУБД для создания программных систем и их компонентов» для студентов направления подготовки «Информатика и вычислительная техника»
230100.68.
В методических указаниях на примерах рассматриваются средства и
возможности СУБД, используемые при проектировании и разработке программных систем и их компонентов.
Методические указания способствуют приобретению навыков использования CASE-средств при моделировании прикладных задач и проектировании схем баз данных; реализации бизнес-процессов программных систем посредством хранимых процедур и функций; поддержания целостности БД посредством триггеров и транзакций; формулирования запросов к
базам данных на языке SQL; разработки приложений для обработки баз
данных на основе технологии ADO.
УДК 004.65
ББК 32.973.26-0.18.2
Работа публикуется в авторской редакции, пунктуации и орфографии.
Компьютерная верстка: Кравчук Т. А.
 Составление. ФГБОУ ВПО «Северо-Кавказский
горно-металлургический институт (государственный
технологический университет)», 2015
 Будаева А. А., составление, 2015
Подписано в печать 27.01.15. Формат бумаги 60х84 1/16. Бумага офсетная. Гарнитура «Таймс».
Печать на ризографе. Усл. п.л. 3,37. Уч.-изд.л. 1,96. Тираж 20 экз. Заказ № ____.
Северо-Кавказский горно-металлургический институт (государственный
технологический университет). Изд-во «Терек».
Отпечатано в отделе оперативной полиграфии СКГМИ (ГТУ).
362021. Владикавказ, ул. Николаева, 44.
2
Оглавление
Введение ................................................................................................ 4
Практическое занятие № 1. Проектирование и создание
базы данных .......................................................................................... 5
Практическая занятие № 2. Операторы манипулирования
данными языка SQL ............................................................................. 16
Практическое занятие №3. Создание и использование
представлений ....................................................................................... 25
Практическое занятие №4. Создание и использование триггеров... 33
Практическое занятие N 5. Создание и использование
хранимых процедур .............................................................................. 37
Практическое занятие №6. Управление доступом в MS SQL
Server ...................................................................................................... 54
Список литературы ............................................................................... 56
Приложение........................................................................................... 57
3
Введение
Современные системы управления базами данных (СУБД) – важнейшее направление, без основательного знакомства с которым в
настоящее время невозможно быть квалифицированным специалистом в области информационных технологий.
Целью данной методической разработки является оказание помощи студентам, изучающим дисциплину «Использование СУБД для
создания программных систем и их компонентов», в решении различных практических задач, связанных с использованием баз данных для
создания программных систем и их компонентов.
Методические указания содержат описание 6 практических занятий и посвящены изучению таких вопросов, как методика проектирования баз данных с использованием CASE-средств; формирование запросов на языке SQL; управление доступом к данным в СУБД; реализация бизнес-процессов программных систем посредством хранимых
процедур и функций, администрирование данных, особенности управления транзакциями, словарь данных, безопасность.
Основная цель практикума – выработка у студентов практических
навыков и расширение теоретических знаний о возможностях реляционных баз данных, системах управления базами данных, типологией и
архитектурой СУБД, основными объектами БД.
В практических работах предусматривается общее ознакомление
с разным инструментарием современных СУБД, в том числе язык TSQL (процедуры, функции, триггеры, курсоры и т. д.), В качестве
предмета исследования выбрана промышленная СУБД фирмы MS
SQL SERVER 2008.
Этот комплексный подход обеспечивает полноценное теоретическое и практическое освоение технологий систем управления базами
данных.
4
Практическое занятие №1
ПРОЕКТИРОВАНИЕ И СОЗДАНИЕ БАЗЫ ДАННЫХ
Цель работы:
1) Проектирование БД на основе ER-диаграммы
2) Написание SQL-скрипта для создания схемы базы данных с
учетом ограничений и связей между данными в выбранной предметной области.
Постановка задачи
Практическое задание связано с проектированием схемы базы
данных. Каждый индивидуальный вариант содержит ER-диаграмму
некоторой предметной области, иногда очень приблизительную (она
может быть модифицирована, но не в сторону упрощения). Задачей
студента является решить, для чего будет использоваться создаваемая
база данных, и, исходя из этого, построить её концептуальную схему.
Результатом данного практического задания является схема базы данных (в виде диаграммы, содержащей таблицы и связи между ними, без
уточнения типов столбцов). Максимальная оценка за данное задание
всегда составляет 8 баллов, а студент может сдавать схему несколько
раз, исправляя замечания преподавателей. При сдаче задания студент
должен обосновать соответствие созданной схемы поставленной задаче.
Темы для проработки
• Модель "сущность-связь" (ER-модель).
• Первичные и внешние ключи.
• Типы связей и их моделирование.
• Нормальные формы и нормализация.
• Оператор CREATE TABLE, CREATE DATABASE, типы данных SQL,
• Декларативные ограничения целостности.
Требования к схеме
• Схема должна соответствовать поставленной задаче.
• Связи между сущностями должны быть правильно смоделированы.
• Таблицы должны удовлетворять, по крайней мере, третьей
нормальной форме.
5
• Желательно придерживаться какой-либо системы в именовании таблиц и столбцов.
Выполнение работы
 Изучить ER-диаграмму, приведенную в вашем варианте индивидуального задания, при необходимости – модифицировать ее. Заданная ER-диаграмма дает лишь ориентировочное представление о
структуре данных заданной Вам предметной области, Вы можете модифицировать ее (но не в сторону упрощения!), добавив новые сущности, атрибуты, связи.
 Конвертировать ER-диаграмму в концептуальную схему, отображаемую на реляционные таблицы.
 Составить SQL-скрипт для создания таблиц базы данных,
включив в него все требуемые логикой предметной области декларативные ограничения целостности (первичные и внешние ключи, проверочные ограничения и т. п.).
Пример выполнения работы
В качестве примера рассмотрим предметную область «Музыкальные предпочтения» (рис. 1)/
Первым шагом в проектировании схемы базы данных является
определение цели создания базы данных. Зададимся целью создать
простую социальную сеть для меломанов, позволяющую им:
 Находить людей, которые имеют схожие музыкальные вкусы.
 Получать от системы рекомендации, какие еще песни, альбомы
и исполнители могут им понравиться.
 Просматривать рейтинг исполнителей, альбомов и композиций.
Схема базы данных для этого случая может выглядеть, например,
следующим образом:
Рис. 1
6
Рассмотрим получившиеся таблицы и некоторые рассуждения,
которые привели к приведенной схеме:
• Таблица User хранит данные о пользователе-меломане. Помимо базовых данных, таких как имя, фамилия, пол, дата рождения и
город, эта таблица хранит также адрес электронной почты для связи и
авторизации в предполагаемой социальной сети (а также хэш пароля).
• Таблицы City и Country служат справочниками для городов и
стран, позволяя избежать избыточности и аномалий обновления.
• Таблица Song хранит уникальный идентификатор и название
песни. Таблица Genre является справочником жанров, а таблица
SongGenre связывает песни и жанры, моделируя связь типа «многиеко-многим», так как одна песня может быть помечена несколькими
жанрами, а также каждый жанр может включать несколько песен.
• Таблица Album хранит информацию об альбомах. Так как одна
песня может быть включена в несколько альбомов, а каждый альбом
может содержать несколько песен, но требуется таблица SongAlbum
для организации связи «многие-ко-многим». Эта таблица также хранит номер трека данной песни в альбоме.
• Важным столбцом в таблице Album является ссылка на исполнителя, если это альбом одного исполнителя. Если же это альбомсборник, то ArtistID будет содержать неопределенное значение.
• Таблица Artist хранит данные об исполнителях, включая страну исполнителя. Исполнители связаны с песнями опять же с помощью
связи «многие-ко-многим» (таблица SongArtist), учитывая случаи,
когда у песни есть несколько исполнителей.
• Наконец, таблица Like хранит предпочтения пользователей:
какая песня, когда и насколько понравилась – пусть Score отражает
оценку пользователем песни от 1 («ничего особенного») до 5 («очень
нравится»).
Детальная схема представленной модели приведена на рис 2.
Пример SQL-скрипта для схемы, представленной на рисунке 2
Создадим отдельный скрипт для MS SQL Server, используя специфические типы данных.
CREATE TABLE SongAlbum (
SongID INTEGER NOT NULL REFERENCES Song (ID),
AlbumID INTEGER NOT NULL REFERENCES Album (ID),
TrackNo INTEGER NOT NULL
PRIMARY KEY (SongID, AlbumID, TrackNo),
7
Рис. 2
8
);
CREATE TABLE Album (
ID INTEGER NOT NULL PRIMARY KEY,
Title VARCHAR(20),
Year INTEGER,
ArtistID INTEGER REFERENCES Artist (ID)
);
CREATE TABLE SongArtist (
SongID INTEGER NOT NULL REFERENCES Song (ID),
ArtistID INTEGER REFERENCES Artist (ID)
PRIMARY KEY (SongID, ArtistID)
);
CREATE TABLE Song (
ID INTEGER NOT NULL PRIMARY KEY,
Title VARCHAR(20),
);
CREATE TABLE Artist (
ID INTEGER NOT NULL PRIMARY KEY,
Name VARCHAR(40),
CountryID INTEGER REFERENCES Country (ID)
);
CREATE TABLE Country (
id INTEGER NOT NULL PRIMARY KEY,
Name VARCHAR(20)
);
CREATE TABLE City (
id INTEGER NOT NULL PRIMARY KEY,
CountryID INTEGER REFERENCES Country (ID),
Name VARCHAR(20)
);
CREATE TABLE User (
ID INTEGER NOT NULL PRIMARY KEY,
FirstName VARCHAR(20),
LastName VARCHAR(20),
Sex CHAR(1),
9
BirthDate DATETIME,
CityID REFERENCES City (id),
Email VARCHAR(20),
PasswordHash VARCHAR(50)
);
и т.д.
Индивидуальные задания
Вариант 1. Предметная область «Библиотека»
Вариант 2. Предметная область «Университет»
Вариант 3. Предметная область «Отдел продаж»
10
Вариант 4. Предметная область «Производство»
Вариант 5. Предметная область «Кооперативы»
Вариант 6. Предметная область «Автомастерская»
11
Вариант 7. Предметная область «Сессия»
Вариант 8. Предметная область «Управление проектом»
Вариант 9. Предметная область «Поликлиника»
12
Вариант 10. Предметная область «Сотовая связь»
Вариант 11. Предметная область «Спортивная статистика»
Вариант 12. Предметная область «Поставки»
13
Вариант 13. Предметная область «Городской транспорт»
Вариант 14. Предметная область «География»
Вариант 15. Предметная область «Домоуправление»
14
Контрольные вопросы
• Объяснить, что делают написанные запросы.
• В чем различие типов CHAR и VARCHAR? VARCHAR и
NVARCHAR?
• Что такое внешний ключ?
• Какие существуют способы поддержания ссылочной целостности?
• Что такое уникальный ключ?
• Что такое нормализация?
• Рассказать о нормальных формах.
• Что такое IDENTITY?
• Рассказать о значениях по умолчанию и неопределенных значениях.
• Рассказать о вычисляемых столбцах.
• Как можно представить значение булевского типа?
• Как можно хранить даты и время?
• Рассказать о числовых типах данных.
• Каким образом можно вставить несколько строк с помощью
одного оператора INSERT?
• Как ведет себя оператор INSERT, если в списке столбцов перечислены не все столбцы?
15
Практическая занятие №2
ОПЕРАТОРЫ МАНИПУЛИРОВАНИЯ
ДАННЫМИ ЯЗЫКА SQL
Цель: освоение способов манипулирования данными в средах интерактивного SQL СУБД Microsoft SQL Server.
Постановка задачи
Практическое задание посвящено манипулированию данными с
помощью операторов SQL. В ходе выполнения практического задания
необходимо:
1. Составить SQL-скрипты для выполнения выборок, указанных в
индивидуальном варианте. Кроме этого, нужно подготовить еще 3-4
выборки, которые имеют осмысленное значение для предметной области, и также составить для них SQL-скрипты.
2. Сформулировать 3-4 запроса на изменение и удаление из базы
данных. Запросы должны быть сформулированы в терминах предметной области. Среди запросов обязательно должны быть такие, которые будут вызывать срабатывание ограничений целостности. Составить SQL-скрипты для выполнения этих запросов.
Темы для проработки
1. Оператор SELECT.
2. Оператор UPDATE.
3. Оператор DELETE.
4. Декларативные ограничения целостности.
Примеры
Рассмотрим несколько примеров, показывающих различные способы построения запросов и некоторые полезные возможности MS
SQL Server 2005:
Вывести имена и фамилии меломанов, которым нравятся только
песни, которые не нравятся больше никому.
SELECT FirstName, LastName
FROM [User] WHERE [User].ID IN
16
(SELECT UserID FROM [Like]
EXCEPT
SELECT UserID FROM [Like] WHERE SongID IN
(SELECT SongID
FROM [Like]
GROUP BY SongID
HAVING COUNT(DISTINCT UserID) > 1))
FirstName LastName
Определить самый популярный музыкальный жанр среди меломанов из Нью-Йорка.
SELECT TOP 1 WITH TIES
Genre.[Name] AS Genre
FROM Song
LEFT JOIN [Like] ON Song.ID = [Like].SongID
JOIN SongGenre ON Song.ID = SongGenre.SongID
JOIN Genre ON Genre.ID = SongGenre.GenreID 24
WHERE [Like].UserID IN
(SELECT [User].ID
FROM [User] JOIN City ON [User].CityID = City.ID
WHERE City.[Name] = 'New York')
GROUP BY Genre.[Name]
ORDER BY ISNULL(SUM(Score), 0) DESC
Подсчитать, сколько людей из Америки слушают «The Beatles».
SELECT COUNT(DISTINCT [Like].UserID) AS [Count]
FROM [Like] JOIN Song ON [Like].SongID = Song.ID
JOIN SongArtist ON Song.ID = SongArtist.SongID
JOIN Artist ON Artist.ID = SongArtist.ArtistID
WHERE
Artist.[Name] = 'The Beatles' AND
[Like].UserID IN
(SELECT [User].ID
FROM [User]
JOIN City ON [User].CityID = City.ID
JOIN Country ON Country.ID = City.CountryID
WHERE Country.[Name] = 'USA')
17
Определить название самой популярную песни жанра «Rock-nRoll» в 2012 году.
WITH SongScores2012 AS
(SELECT Song.Title, SUM(Score) AS TotalScore
FROM Song
LEFT JOIN [Like] ON [Like].SongID = Song.ID
JOIN SongGenre ON Song.ID = SongGenre.SongID
JOIN Genre ON Genre.ID = SongGenre.GenreID
WHERE YEAR([Like].Date) = 2012 AND Genre.[Name] = 'Rock-nRoll'
GROUP BY Song.ID, Song.Title)
SELECT Title
FROM SongScores2012
WHERE TotalScore = (SELECT MAX(TotalScore) FROM SongScores2012)
Приведем еще пример выборки, осмысленной для предметной
области «Музыкальные предпочтения»: порекомендовать пользователю «john@mail.com» 3 самых популярных песни (с исполнителями)
жанра «Heavy Metal», которые он еще не слышал. Подобный запрос,
можно составить, например, таким образом:
SELECT TOP 3 WITH TIES
(SELECT Artist.[Name] + '; '
FROM Artist JOIN SongArtist ON Artist.ID = SongArtist.ArtistID
WHERE SongArtist.SongID = S.ID FOR XML PATH('')) AS 'Artist(s)',
S.[Title]
FROM Song S LEFT JOIN [Like] ON [Like].SongID = S.ID
WHERE EXISTS(
SELECT * FROM SongGenre JOIN Genre ON SongGenre.GenreID =
Genre.ID 25
WHERE Genre.[Name] = 'Heavy Metal' AND SongGenre.SongID =
S.ID
)
AND S.ID NOT IN
(SELECT SongID FROM [Like]
JOIN [User] ON [Like].UserID = [User].ID
WHERE [User].Email = 'john@mail.com')
GROUP BY S.[Title], S.[ID]
18
ORDER BY ISNULL(SUM(Score), 0) DESC
Artist(s) Title
Рассмотрим теперь примеры запросов для удаления и модификации данных. Например, удалим из таблицы предпочтений строки,
набравшие в сумме меньше 3 очков:
DELETE FROM [Like]
WHERE SongID IN
(SELECT SongID FROM [Like]
GROUP BY SongID
HAVING SUM(Score) < 3
)
Напишем теперь запрос на удаление данных, который не срабатывает из-за ограничений ссылочной целостности:
DELETE FROM Genre
WHERE [Name] = 'Heavy Metal'
Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint
"FK_SongGenre_Genre". The conflict occurred in database "MusicFans",
table "dbo.SongGenre", column 'GenreID'.
The statement has been terminated.
Рассмотрим теперь модификацию данных. В качестве первого
примера напишем запрос, который заменит все имена и фамилии
пользователей на инициалы:
UPDATE [User] SET
FirstName = SUBSTRING(FirstName, 1, 1),
LastName = SUBSTRING(LastName, 1, 1)
SELECT ID, FirstName, LastName FROM [User]
ID FirstName LastName
Продемонстрировать работу проверочных ограничений можно,
например, таким запросом:
UPDATE [Like] SET Score = 6 WHERE SongID = 1 26
Msg 547, Level 16, State 0, Line 1
19
The UPDATE statement conflicted with the CHECK constraint
"CK_Like_Score". The conflict occurred in database "MusicFans", table
"dbo.Like", column 'Score'.
The statement has been terminated.
В качестве последнего примера рассмотрим нарушение ограничения уникального ключа:
UPDATE [User] SET Email = 'john@mail.com' WHERE ID = 2
Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.User' with unique index
'IX_User'.
The statement has been terminated.
Индивидуальные задания
Каждое задание содержит 4 выборки, которые необходимо записать в виде SQL-команд
Вариант 1. Предметная область «Библиотека»
1. Выбрать книгу по физике, которая наиболее популярна у читателей (максимальное число выдач за год).
2. Выбрать читателей, которые имеют задолженность более 2 месяцев.
3. Определить книгу, которая была наиболее популярной зимой
2005 года.
4. Определить читателей, у которых на руках находятся книги издательства "Наука".
Вариант 2. Предметная область «Университет»
1. Выбрать преподавателей, у которых наибольшее количество
пар осенью 2005г.
2. Определить возможные "накладки" у преподавателей в расписании.
3. Вывести расписание занятий преподавателя 'Половинкин
Е.С.' на ноябрь 2005 г.
4. Определить для каждой группы количество экзаменов и зачетов.
20
Вариант 3. Предметная область «Отдел продаж»
1. Выбрать покупателей, которые покупают наибольшее число
разных товаров.
2. Определить покупателя, который покупает товар 'коврик для
мыши' по самой высокой в среднем цене.
3. Вывести названия товаров, цены на которые только росли.
4. Определить, какие товары продаются в этом году хуже, чем в
прошлом за то же количество месяцев.
Вариант 4. Предметная область «Производство»
1. Определить изделие, с наибольшей длительностью производства
2. Вывести список оборудования, требующего замены в ближайшие полгода
3. Вывести список изделий, которых получается больше всего из
единицы объема стали.
4. Вывести средний срок годности оборудования.
Вариант 5. Предметная область «Кооперативы»
1. Определить самого старого предпринимателя, владеющего паем в кооперативе в районе 'Киевский'.
2. Определить самого молодого пайщика кооператива, у которого
максимальный пай вклада.
3. Определить случаи, когда больше 50% уставного капитала кооператива внесено предпринимателем, проживающим в этом же районе.
4. Вывести список профилей кооперативов, которыми владеет
предприниматель 'Старусин' в порядке возрастания вложенного в них
капитала.
Вариант 6. Предметная область «Автомастерская»
1. Выбрать фамилию того механика, который чаще всех работает
с новыми автомобилями.
2. Выбрать фамилию хозяина, чаще всего посещающего мастерскую и имеющего автомобиль марки "Мерседес"
3. Определить тех владельцев автомобилей, которых всегда обслуживает один и тот же механик. Вывести фамилии механика и его
постоянного клиента.
4. Для каждой марки автомобиля выбрать механика, чаще всего
обслуживающего эту марку.
21
Вариант 7. Предметная область «Сессия»
1. Выбрать группу с наибольшей продолжительностью сессии.
2. Определить преподавателя, который в сессию принимает зачеты у наибольшего числа студентов.
3. Определить, процент сдаваемых группой '473' экзаменов от
общего числа предметов для каждой категории.
4. Определить, не сдает ли какая-либо группа два экзамена или
зачета в один день
Вариант 8. Предметная область «Управление проектом»
1. Определить те работы в 2000 г., по которым дата завершения
превышает крайний срок, то есть проект просрочен.
2. Определить максимальное количество проектов у одного работника в 1999 году.
3. Определить те работы, которые к дате завершения были выполнены не более, чем на 50%.
4. Определить 5 сотрудников, выполняющих наибольший объем
работ.
Вариант 9. Предметная область «Поликлиника»
1. Определить те случаи, когда пациент лечился менее месяца.
2. Вывести имена тех врачей, которые работают исключительно с
инвалидами.
3. Определить процент смертности от заболевания 'кариес'.
4. Пациентов, которые лечились у врачей всех специальностей.
Вариант 10. Предметная область «Сотовая связь»
1. Выбрать наиболее популярный тариф для каждого оператора.
2. Определить суммарную задолженность по каждому из тарифов.
3. Подсчитать, сколько имеется незарегистрированных номеров у
каждого из операторов.
4. Выбрать список абонентов оператора 'МТС', имеющих задолженность больше 3000.
Вариант 11. Предметная область «Спортивная статистика»
1. Вывести таблицу распределения мест в соревновании 'открытый чемпионат' в городе 'Васюки' по 'шахматам' в 2000 г.
2. Определить спортсменов, которые имеют как олимпийский,
так и мировой рекорд.
22
3. Вывести список спортсменов, участвующих более чем в 8 соревнованиях в году в порядке возрастания среднего места на этих соревнованиях.
4. Определить наилучший показатель спортсмена 'Караваев' в виде спорта 'тараканьи бега и разницу с мировым и олимпийским рекордами.
Вариант 12. Предметная область «Поставки»
1. Вывести предприятия, которые провели в текущем году не более 1 операции.
2. Определить, предприятие какого вида деятельности является
ведущим в поставке продукта 'банан'.
3. Определить случаи, когда были проданы товары, которые являлись годными не более недели.
4. Вывести список продуктов, для которых закупочная цена, как
правило, ниже себестоимости производителя.
Вариант 13. Предметная область «Городской транспорт»
1. Определить самое прибыльное средство передвижения (отношение средняя плата за проезд/средние затраты на топливо максимально)
2. Определить среднее отношение числа троллейбусов на маршруте к числу остановок.
3. Вывести маршруты машины 'Газель' в порядке убывания их
протяженности.
4. Определить предполагаемую прибыль фирмы за день.
Вариант 14. Предметная область «География»
1. Расположить страны по многонациональности, в порядке убывания.
2. Подсчитать численность населения монархий.
3. Определить тип управления той страны, где проживает более
всего представителей национальности 'армяне'.
4. Выбрать список национальностей, проживающих в странах с
анархическим строем.
Вариант 15. Предметная область «Домоуправление»
1. Определить сумму месячной оплаты для квартиры №50 в доме
302 бис по Садовой улице.
23
2. Определить задолженность по оплате 'доставка мусора' Константинова Романа Викторовича.
3. Определить общую сумму выплат для квартир по Первомайской улице.
4. Выбрать список владельцев, которые имеют задолженности
более года.
Контрольные вопросы
1. Объяснить, как работают написанные запросы.
2. Исправить неверно работающий запрос (запросы).
3. Упростить один или несколько запросов.
4. Написать или модифицировать запрос по сформулированному
заданию.
24
Практическое занятие №3
СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ ПРЕДСТАВЛЕНИЙ
Цель работы: приобретение навыков работы с представлениями.
Темы для предварительной проработки
 Оператор создания представления языка SQL.
Выполнение работы
 Подготовить SQL-скрипт для создания представлений, заданных в Вашем варианте индивидуального задания..
 Сформулировать 3-4 запроса на выполнение выборок из представлений и составить соответствующие SQL-скрипты.
Постановка задачи
Практическое задание посвящено созданию и использованию
представлений: требуется составить SQL-скрипты для создания 4
представлений согласно индивидуальному варианту.
Темы для проработки
• Оператор CREATE VIEW.
• Вставка и модификация данных через представления.
Примеры
Создадим несколько полезных представлений для нашей базы
данных. Пусть в первом представлении требуется показывать следующие данные: название песни, суммарная оценка, количество людей,
которым нравится эта песня и средняя оценка.
IF EXISTS(
SELECT * FROM sys.views
WHERE [name] = 'SongScores' AND
schema_id = SCHEMA_ID('dbo'))
DROP VIEW SongScores
25
GO
CREATE VIEW SongScores AS
(SELECT
Song.Title,
ISNULL(SUM([Like].Score), 0) AS TotalScore,
COUNT([Like].UserID) AS Fans,
ISNULL(AVG(1.0*[Like].Score), 0) AS AverageScore
FROM Song
LEFT JOIN [Like] ON Song.ID = [Like].SongID
GROUP BY Song.ID, Song.Title)
GO
SELECT * FROM SongScores
Title TotalScore Fans AverageScore
В этом примере представление удаляется, если оно существовало,
а затем создается, и производится выборка из него, чтобы проверить
правильность данных.
Создадим теперь представление, содержащее название исполнителя, количество альбомов с его участием, количество песен с участием этого исполнителя.
IF EXISTS(
SELECT * FROM sys.views
WHERE [name] = 'Artists' AND
schema_id = SCHEMA_ID('dbo'))
DROP VIEW Artists
GO
CREATE VIEW Artists AS
(SELECT
Artist.[Name] AS Artist,
COUNT(DISTINCT Album.ID) AS AlbumCount,
COUNT(DISTINCT SongArtist.SongID) AS SongCount
FROM Artist
LEFT JOIN SongArtist ON Artist.ID = SongArtist.ArtistID
LEFT JOIN SongAlbum ON SongArtist.SongID = SongAlbum.SongID
LEFT JOIN Album ON Album.ID = SongAlbum.AlbumID
GROUP BY Artist.[Name], Artist.ID)
GO
26
SELECT * FROM Artists
Artist AlbumCount SongCount
В качестве следующего представления рассмотрим распределение активности меломанов по месяцам года: требуется вывести год,
месяц, когда была какая-то активность и количество песен, которые
понравились меломанам за этот месяц.
IF EXISTS(
SELECT * FROM sys.views
WHERE [name] = 'Activity' AND
schema_id = SCHEMA_ID('dbo'))
DROP VIEW Activity
GO
CREATE VIEW Activity AS
(SELECT
DATENAME(YYYY, [Like].Date) AS 'Year',
DATENAME(MM,
[Like].Date)
AS
'Month',
COUNT([Like].SongID) AS SongCount
FROM [Like]
GROUP BY DATENAME(YYYY, [Like].Date), DATENAME(MM,
[Like].Date))
GO
SELECT * FROM Activity
Year Month SongCount
В качестве последнего представления рассмотрим следующее:
для каждого пользователя вывести имя, фамилию, город и количество
меломанов из этого города, которым нравится хотя бы одна песня из
предпочтений этого пользователя.
IF EXISTS(
SELECT * FROM sys.views
WHERE [name] = 'Fans' AND
schema_id = SCHEMA_ID('dbo'))
DROP VIEW Fans
GO
CREATE VIEW Fans AS
27
(SELECT FirstName,
LastName,
Country.[Name] AS Country,
City.[Name] AS City,
(SELECT COUNT(DISTINCT UserID)
FROM [Like]
WHERE
SongID IN
(SELECT SongID FROM [Like] WHERE [Like].UserID = U.ID)
AND [Like].UserID <> U.ID
) AS Fans
FROM [User] U
JOIN City ON U.CityID = City.ID
JOIN Country ON City.CountryID = Country.ID)
GO
SELECT * FROM Fans
FirstName LastName Country City Fans
Индивидуальные задания
Требуется составить SQL-скрипты для создания 4 представлений
согласно индивидуальному варианту.
Дополнительно написать команды по модификации данных из
представлений с проверкой правильности операции.
Вариант 1. Предметная область «Библиотека»
1. Тема, название книги, фамилия читателя, дата возврата – для
книг, у которых просрочен срок возврата, количество дней просрочки.
2. ФИО читателей, номер паспорта, количество прочитанных
книг – для читателей, которые всегда приносят книги в срок.
3. Для книги "Русские сказки" показать все ее состояния за 5 последних лет.
4. Для каждого издательства подсчитать количество книг в библиотеке и суммарное количество их выдач.
Вариант 2. Предметная область «Университет»
1. Название предмета, количество лекций, семинаров, лабораторных занятий по нему.
28
2. Группа, дата, время, название предмета, преподаватель, аудитория. (вид занятия – лекция)
3. Название кафедры, название предмета, количество преподавателей, с ними связанных.
4. Группа, предмет, преподаватель, вид проверки.
Вариант 3. Предметная область «Отдел продаж»
1. Покупатель, товар, дата, общая стоимость покупки.
2. Покупатель, месяц, суммарное число единиц товара, купленных покупателем в этот месяц, суммарная стоимость товаров.
3. Производитель, месяц, общее количество единиц товаров, проданных в этот месяц, суммарная стоимость товаров.
4. Название товара, производитель, средняя цена за последний
год.
Вариант 4. Предметная область «Производство»
1. Название изделия, название материала, количество, единицы
измерения.
2. Название оборудования, производитель, название спецификации.
3. Название оборудования, количество материала и альтернатив,
количество спецификаций, связанных с изделиями, произведенными
на этом оборудовании.
4. Название материала, тип, суммарная длительность производства спецификаций изделия.
Вариант 5. Предметная область «Кооперативы»
1. Название, профиль, число работников, имя владельца с максимальным вкладом, процент его вклада от общего вклада
2. Название кооператива, ФИО владельца, размер вклада.
3. Район проживания, количество кооперативов в этом районе,
количество человек из этого района, имеющих пай в каком-либо кооперативе
4. Год, профиль кооператива, количество человек, внесших свой
вклад в этот год в кооператив данного профиля.
Вариант 6. Предметная область «Автомастерская»
1. ФИО владельца, марка и год выпуска его автомобиля, стоимость заказа и имя механика.
29
2. Владелец, марки его автомобилей, суммарная стоимость и время ремонта.
3. Автомеханик, разряд, суммарное время работы за месяц, суммарная стоимость заказов.
4. Марка автомобиля, число раз ремонта автомобилей в этой автомастерской, когда время ремонта превышало день.
Вариант 7. Предметная область «Сессия»
1. Факультет, курс, количество зачетов, количество экзаменов в
летнюю сессию.
2. Группа, название предмета, даты всех экзаменов и зачетов по
этому предмету.
3. ФИО преподавателя, название предмета, количество видов
контроля по этому предмету для этого преподавателя.
4. Название предмета, кафедра, общее количество студентов,
сдающих этот предмет в зимнюю сессию.
Вариант 8. Предметная область «Управление проектом»
1. Проект, сотрудник, трудоемкость, дата выдачи, трудоемкость
проекта.
2. Проект, ФИО работника, трудоемкость, процентное отношение
трудоемкости работника к общей трудоемкости проекта.
3. ФИО работника, проекты за последний месяц, трудоемкость
для каждого проекта, время выполнения.
4. Название проекта, суммарное время работы над проектом за
год – для проектов у которых не истек крайний срок в течении года.
Вариант 9. Предметная область «Поликлиника»
1. Врач, пациент, время лечения – только для вылечившихся пациентов.
2. Социальный статус, месяц, диагноз, количество человек, вылечившихся за этот месяц.
3. Врач, количество пациентов за год, лечение которых закончилось успешно, общее количество пациентов за год.
4. Год рождения, количество пациентов этого года рождения, чаще всего встречающийся у них диагноз.
Вариант 10. Предметная область «Сотовая связь»
1. Оператор, тариф, количество зарегистрированных абонентов
для этого тарифа.
30
2. Название оператора, тарифный план, месяц, число подключений в этот месяц.
3. ФИО абонента, количество тарифных планов, любимый оператор связи.
4. Оператор связи, тариф, общая задолженность по тарифу за год,
количество проданных за год тарифов.
Вариант 11. Предметная область «Спортивная статистика»
1. Вид спорта, соревнование, место, дата, мировой рекорд, который был установлен.
2. Вид спорта, количество соревнований за год, количество попаданий спортсменов из 'России' в призеры.
3. Страна, количество спортсменов этой страны, общее количество побед спортсменов этой страны за год на соревнованиях, в названиях которых входит слово 'плавание'.
4. Вид спорта, рекорды, установленные в этом виде спорта за последние пять лет, место соревнований, на которых установлены рекорды.
Вариант 12. Предметная область «Поставки»
1. Предприятие, продукция, год, объем поставок в этом году
2. Предприятие, месяц, объем продаж за этот месяц, суммарная
цена продаж.
3. Название продукции, предприятие, занимающееся продажей
этой продукции, объем продаж за год.
4. Вид деятельности предприятия, количество предприятий, годовой бюджет отрасли.
Вариант 13. Предметная область «Городской транспорт»
1. Вид транспорта, № маршрута, начальный пункт, конечный
пункт.
2. Вид транспорта, количество машин на маршрутах, суммарный
доход, средний доход на одну машину.
3. Маршрут, начальный пункт, конечный пункт, все возможные
способы добраться не более чем с двумя пересадками в конечных
пунктах.
4. Вид транспорта, среднее количество пассажиров в одной машине, если за день машина делает 20 рейсов, средний доход от одного
рейса.
31
Вариант 14. Предметная область «География»
1. Государство, национальность, численность, тип управления.
2. Государство, язык, количество населения, говорящего на этом
языке, процент от всего общего количества населения.
3. Государство, количество мужского населения, количество женского населения, преобладающий язык, преобладающая национальность.
4. Национальность, изменение численности населения за год,
преобладающая страна проживания.
Вариант 15. Предметная область «Домоуправление»
1. Год, дом, квартира, задолженность по оплате.
2. Вид услуг, наличие счетчика, внесенная сумма оплаты за год,
количество человек, оплативших услугу.
3. Владелец, услуга, затраты на услугу в год, средняя сумма оплаты за услугу в месяц.
4. Улица, номер дома, количество услуг, доступных жильцам,
суммарная стоимость за месяц.
Контрольные вопросы
1. Объяснить, как работают написанные запросы.
2. Рассказать о CHECK OPTION.
3. Рассказать о модификации данных через представления.
4. Рассказать о вставке данных через представления.
5. Упростить один или несколько запросов.
6. Продемонстрировать изменение и вставку данных через представления.
7. Написать или модифицировать запрос по сформулированному
заданию
32
Практическое занятие №4
СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ ТРИГГЕРОВ
Цель работы: освоение способов создания триггеров в среде
Microsoft SQL Server.
Темы для предварительной проработки
 Функции триггеров.
 Синтаксис создания триггеров
 Использование триггеров в целях аудита
Выполнение работы
Подготовить план создания триггера для контроля ограничений
целостности, заданных в Вашем варианте индивидуального задания.
Сформулировать 2-4 запроса на добавление / изменение / удаление данных в таблицу, для которой будет назначен триггер. Составить
SQL-скрипты для выполнения этих запросов.
Темы для проработки
1. Функции триггеров.
2. Типы триггеров и условия их срабатывания.
3. Создание и использование триггеров в MS SQL Server.
Примеры
В качестве примера реализуем следующее ограничение целостности, имеющее смысл для предметной области «музыкальные предпочтения»: пользователь может оценивать не более 5 песен в сутки. Создать такой триггер можно, например, следующим образом:
CREATE TRIGGER LimitLikes
ON [Like] AFTER INSERT AS
IF EXISTS(
SELECT [Like].UserID
FROM [Like]
WHERE
[Like].UserID IN (SELECT UserID FROM inserted) AND
33
CONVERT(VARCHAR, [Like].[Date], 105) IN
(SELECT CONVERT(VARCHAR, inserted.[Date], 105)
FROM inserted
WHERE inserted.UserID = [Like].UserID)
GROUP BY [Like].UserID, CONVERT(VARCHAR, [Like].[Date], 105)
HAVING COUNT([Like].SongID) > 5)
BEGIN
ROLLBACK
END
Этот триггер будет срабатывать после вставки записей в таблицу
Like (AFTER INSERT) и не позволит добавлять новые строки, если
лимит в 5 оценок в сутки превышен. Проверим теперь работу
триггера:
INSERT [Like] ([UserID], [SongID], [Score]) VALUES (10, 1, 5)
INSERT [Like] ([UserID], [SongID], [Score]) VALUES (10, 2, 5)
INSERT [Like] ([UserID], [SongID], [Score]) VALUES (10, 3, 5)
INSERT [Like] ([UserID], [SongID], [Score]) VALUES (10, 4, 5)
INSERT [Like] ([UserID], [SongID], [Score]) VALUES (10, 5, 5)
-- Шестая оценка превышает лимит
INSERT [Like] ([UserID], [SongID], [Score]) VALUES (10, 6, 5)
Msg 3609, Level 16, State 1, Line 7
The transaction ended in the trigger. The batch has been aborted.
Индивидуальные задания
Вариант 1 . Предметная область «Библиотека»
Триггер:
при удалении книги, удалять все записи, связанные с ней
Вариант 2. Предметная область «Университет»
Триггер:
при добавлении нового семинара, по возможности, уменьшается
число лекций по данному предмету
Вариант 3. Предметная область «Отдел продаж»
Триггер:
при удалении товара отменяются все фьючерсные сделки с этим
товаром.
34
Вариант 4. Предметная область «Производство»
Триггер:
при удалении материала, в таблице "Спецификация изделий" ID
материала меняется на ID альтернативы, если альтернативы нет, то
записи удаляются.
Вариант 5. Предметная область «Кооперативы»
Триггер:
при удалении/изменении размера вклада размер уставного капитала уменьшается на соответствующую сумму.
Вариант 6. Предметная область «Автомастерская»
Триггер:
стаж считается как число целых лет от первого ремонта до последнего и добавляется с каждым годом.
Вариант 7. Предметная область «Сессия»
Триггер:
При прохождении 10 лет со дня первого экзамена группы из базы
стираются все записи, связанные с ней
Вариант 8. Предметная область «Управление проектом»
Триггер:
При раздаче поручений учитывается, что сумма трудоемкостей
поручений не должна превышать общей трудоемкости работы.
Вариант 9. Предметная область «Поликлиника»
Триггер:
пациент в тяжелом состоянии направляется к наиболее опытному
врачу.
Вариант 10. Предметная область «Сотовая связь»
Триггер:
Количество зарегистрированных номеров не может превышать
количество номеров у оператора.
Вариант 11. Предметная область «Спортивная статистика»
Триггер:
исправление мирового рекорда при появлении соответствующего
результата.
35
Вариант 12. Предметная область «Поставки»
Триггер:
не допускать продажу просроченных продуктов
Вариант 13. Предметная область «Городской транспорт»
Триггер:
Пусть известна цена за литр топлива. Удалить все маршруты, у
которых цена за проезд менее чем в 1.5 превышает расход на топливо.
И не допускать добавления таких маршрутов.
Вариант 14. Предметная область «География»
Триггер:
при изменении численности представителей национальности в
одной стране изменяется общая численность для этой национальности.
Вариант 15. Предметная область «Домоуправление»
Триггер:
оплата не может производиться на срок более чем на 12 месяцев
вперед
Контрольные вопросы
1. Объяснить принцип работы написанного триггера.
2. Какие бывают типы триггеров?
3. Когда может срабатывать триггер?
4. В каком порядке срабатывают триггеры?
5. Можно ли менять порядок срабатывания триггеров?
6. Сработает ли триггер, если оператор, выполненный пользователем, не затрагивает ни одну строку таблицы?
7. Модифицировать триггер каким-либо образом.
36
Практическое занятие №5
СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ
ХРАНИМЫХ ПРОЦЕДУР
Цель работы: научиться создавать и использовать хранимые
процедуры на сервере БД.
Содержание работы:
1. Проработка всех примеров
2. Выполнение всех примеров и заданий по ходу лабораторной
работы.
3. Выполнение индивидуальных заданий по вариантам.
Пояснения к выполнению работы
Для освоения программирования хранимых процедур используем
пример базы данных с названием DB_Books, (см. Приложение). При
выполнении примеров и заданий обращайте внимание на соответствие
названий БД, таблиц и других объектов проекта.
Хранимые процедуры представляют собой набор команд, состоящий из одного или нескольких операторов SQL или функций и сохраняемый в базе данных в откомпилированном виде.
Типы хранимых процедур
Системные хранимые процедуры предназначены для выполнения
различных административных действий. Практически все действия по
администрированию сервера выполняются с их помощью. Можно сказать, что системные хранимые процедуры являются интерфейсом,
обеспечивающим работу с системными таблицами. Системные хранимые процедуры имеют префикс sp, хранятся в системной базе данных и могут быть вызваны в контексте любой другой базы данных.
Пользовательские хранимые процедуры реализуют те или иные
действия. Хранимые процедуры – полноценный объект базы данных.
Вследствие этого каждая хранимая процедура располагается в конкретной базе данных, где и выполняется.
Временные хранимые процедуры существуют лишь некоторое
время, после чего автоматически уничтожаются сервером. Они делят37
ся на локальные и глобальные. Локальные временные хранимые процедуры могут быть вызваны только из того соединения, в котором созданы. При создании такой процедуры ей необходимо дать имя, начинающееся с одного символа #. Как и все временные объекты, хранимые процедуры этого типа автоматически удаляются при отключении
пользователя, перезапуске или остановке сервера. Глобальные временные хранимые процедуры доступны для любых соединений сервера, на котором имеется такая же процедура. Для ее определения достаточно дать ей имя, начинающееся с символов ##. Удаляются эти
процедуры при перезапуске или остановке сервера, а также при закрытии соединения, в контексте которого они были созданы.
Создание, изменение хранимых процедур
Создание хранимой процедуры предполагает решение следующих задач: планирование прав доступа. При создании хранимой процедуры следует учитывать, что она будет иметь те же права доступа к
объектам базы данных, что и создавший ее пользователь; определение
параметров храни- мой процедуры, хранимые процедуры могут обладать входными и выходными параметрами; разработка кода хранимой
процедуры. Код процедуры может содержать последовательность любых команд SQL, включая вызов других хранимых процедур.
Синтаксис оператора создания новой или изменения имеющейся
хранимой процедуры в обозначениях MS SQL Server:
{CREATE | ALTER } PROC[EDURE] имя_процедуры [;номер]
[{@имя_параметра
тип_данных
}
[VARYING
[=DEFAULT][OUTPUT] ][,...n]
[WITH { RECOMPILE | ENCRYPTION | RECOMPILE,
ENCRYPTION }]
[FOR REPLICATION]
AS
sql_оператор [...n]
]
Рассмотрим параметры данной команды.
Используя префиксы sp_, #, ##, создаваемую процедуру можно
определить в качестве системной или временной. Как видно из синтаксиса команды, не допускается указывать имя владельца, которому
будет принадлежать создаваемая процедура, а также имя базы данных,
38
где она должна быть размещена. Таким образом, чтобы разместить
создаваемую хранимую процедуру в конкретной базе данных, необходимо выполнить команду CREATE PROCEDURE в контексте этой
базы данных. При обращении из тела хранимой процедуры к объектам
той же базы данных можно использовать укороченные имена, т. е. без
указания имени базы данных. Когда же требуется обратиться к объектам, расположенным в других базах данных, указание имени базы
данных обязательно.
Для передачи входных и выходных данных в создаваемой хранимой процедуре имена параметров должны начинаться с символа @. В
одной хранимой процедуре можно задать множество параметров, разделенных запятыми. В теле процедуры не должны применяться локальные переменные, чьи имена совпадают с именами параметров
этой процедуры. Для определения типа данных параметров хранимой
процедуры подходят любые типы данных SQL, включая определенные пользователем. Однако тип данных CURSOR может быть использован только как выходной параметр хранимой процедуры, т.е. с указанием ключевого слова OUTPUT.
Наличие ключевого слова OUTPUT означает, что соответствующий параметр предназначен для возвращения данных из хранимой
процедуры. Однако это вовсе не означает, что параметр не подходит
для передачи значений в хранимую процедуру. Указание ключевого
слова OUTPUT предписывает серверу при выходе из хранимой процедуры присвоить текущее значение параметра локальной переменной,
которая была указана при вызове процедуры в качестве значения параметра. Отметим, что при указании ключевого слова OUTPUT значение соответствующего параметра при вызове процедуры может быть
задано только с помощью локальной переменной. Не разрешается использование любых выражений или констант, допустимое для обычных параметров. Ключевое слово VARYING применяется совместно с
параметром OUTPUT, имеющим тип CURSOR. Оно определяет, что
выходным параметром будет результирующее множество.
Ключевое слово DEFAULT представляет собой значение, которое
будет принимать соответствующий параметр по умолчанию. Таким
образом, при вызове процедуры можно не указывать явно значение
соответствующего параметра.
Так как сервер кэширует план исполнения запроса и компилированный код, при последующем вызове процедуры будут использоваться уже готовые значения. Однако в некоторых случаях все же требуется выполнять перекомпиляцию кода процедуры. Указание ключе39
вого слова RECOMPILE предписывает системе создавать план выполнения хранимой процедуры при каждом ее вызове.
Параметр FOR REPLICATION востребован при репликации данных и включении создаваемой хранимой процедуры в качестве статьи
в публикацию. Ключевое слово ENCRYPTION предписывает серверу
выполнить шифрование кода хранимой процедуры, что может обеспечить защиту от использования авторских алгоритмов, реализующих
работу хранимой процедуры. Ключевое слово AS размещается в начале собственно тела хранимой процедуры. В теле процедуры могут
применяться практически все команды SQL, объявляться транзакции,
устанавливаться блокировки и вызываться другие хранимые процедуры. Выход из хранимой процедуры можно осуществить посредством
команды RETURN.
Удаление хранимой процедуры
DROP PROCEDURE {имя_процедуры} [,...n]
Выполнение хранимой процедуры
Для выполнения хранимой процедуры используется команда:
[[ EXEC [ UTE] имя_процедуры [;номер]
[[@имя_параметра=]{значение | @имя_переменной}
[OUTPUT ]|[DEFAULT ]][,...n]
Если вызов хранимой процедуры не является единственной командой в пакете, то присутствие команды EXECUTE обязательно. Более того, эта команда требуется для вызова процедуры из тела другой
процедуры или триггера.
Использование ключевого слова OUTPUT при вызове процедуры
разрешается только для параметров, которые были объявлены при создании процедуры с ключевым словом OUTPUT.
Когда же при вызове процедуры для параметра указывается ключевое слово DEFAULT, то будет использовано значение по умолчанию. Естественно, указанное слово DEFAULT разрешается только для
тех параметров, для которых определено значение по умолчанию.
Из синтаксиса команды EXECUTE видно, что имена параметров
могут быть опущены при вызове процедуры. Однако в этом случае
40
пользователь должен указывать значения для параметров в том же
порядке, в каком они перечислялись при создании процедуры. Присвоить параметру значение по умолчанию, просто пропустив его при
перечислении, нельзя. Если же требуется опустить параметры, для
которых определено значение по умолчанию, достаточно явного указания имен параметров при вызове хранимой процедуры. Более того,
таким способом можно перечислять параметры и их значения в произвольном порядке.
Отметим, что при вызове процедуры указываются либо имена пара- метров со значениями, либо только значения без имени параметра.
Их комбинирование не допускается.
Использование RETURN в хранимой процедуре
Позволяет выйти из процедуры в любой точке по указанному
условию, а также позволяет передать результат выполнения процедуры числом, по которому можно судить о качестве и правильности выполнения процедуры.
Пример создания процедуры без параметров:
CREATE PROCEDURE Count_Books AS
SELECT count(Code_book) FROM Books
Go
Задание 1. Запуск процедуры
EXEC Count_Books
Пример создания процедуры c входным параметром:
CREATE PROCEDURE Count_Books_Pages @Count_pages AS Int
AS
SELECT
count(Code_book)
FROM
Books
WHERE
Pages>=@Count_pages
Go
41
Задание 2. Запуск процедуры Count_Books_Pages
EXEC Count_Books_Pages 100
Пример создания процедуры c входными параметрами:
CREATE PROCEDURE Count_Books_Title @Count_pages AS Int,
@Title AS
Char(10)
AS
SELECT
count(Code_book)
FROM
Books
WHERE
Pages>=@Count_pages
AND Title_book LIKE @Title
Go
Задание 3. Запуск процедуры Count_Books_Title
EXEC Count_Books_Title 100, 'П%'
Пример создания процедуры с входными параметрами
и выходным параметром:
CREATE PROCEDURE Count_Books_Itogo @Count_pages Int, @Title
Char(10) , @Itogo Int OUTPUT
AS
SELECT @Itogo = count(Code_book) FROM Books WHERE
Pages>=@Count_pages AND Title_book LIKE @Title
Go
Задание 4. Запуск процедуры с помощью набора команд T-SQL
sql>
Declare @q As int
EXEC Count_Books_Itogo 100, 'П%', @q output
select @q
Пример создания процедуры c входными параметрами
42
и RETURN:
CREATE PROCEDURE checkname @param int
AS
IF (SELECT Name_author FROM authors WHERE Code_author =
@param) =
'Пушкин А.С.'
RETURN 1
ELSE
RETURN 2
Задание 5. Запуск процедуры с помощью набора команд T-SQL
DECLARE @return_status int
EXEC @return_status = checkname 1
SELECT 'Return Status' = @return_status
Пример создания процедуры без параметров для увеличения
значения ключевого поля в таблице Purchases в 2 раза:
CREATE PROC update_proc
AS
UPDATE Purchases SET Code_purchase = Code_purchase*2
Процедура не возвращает никаких данных.
Задание 6. Запуск процедуры
EXEC update_proc
Пример процедуры с входным параметром для получения всей информации о конкретном авторе:
CREATE PROC select_author @k CHAR(30)
AS
SELECT * FROM Authors WHERE name_author=@k
Задание 7. Запуск процедуры с помощью набора команд
43
EXEC select_author 'Пушкин А.С.' или
select_author @k='Пушкин А.С.' или
EXEC select_author @k='Пушкин А.С.'
Пример создания процедуры с входным параметром и значением
по умолчанию для увеличения значения ключевого поля в таблице
Purchases в заданное количество раза (по умолчанию в 2 раза):
CREATE PROC update_proc @p INT = 2
AS
UPDATE Purchases SET Code_purchase = Code_purchase *@p
Процедура не возвращает никаких данных.
Задание 8. Запуск процедуры с помощью набора команд:
EXEC update_proc 4 или
EXEC update_proc @p = 4 или
EXEC update_proc --будет использовано значение по умолчанию.
Пример создания процедуры с входным и выходным параметрами. Создать процедуру для определения количества заказов,
совершенных за указанный период:
CREATE PROC count_purchases
@d1 SMALLDATETIME, @d2 SMALLDATETIME,
@c INT OUTPUT
AS
SELECT @c=count(Code_purchase) FROM Purchases
Date_order
BETWEEN @d1 AND @d2
SET @c = ISNULL(@c,0)
44
WHERE
Задание 9. Запуск процедуры с помощью набора команд:
DECLARE @c2 INT
EXEC count_purchases ’01-jun-2006’, ’01-jul-2006’, @c2 OUTPUT
SELECT @c2
Задания для самостоятельного выполнения
Задание 1. Создать два – три представления из одной и нескольких таблиц используемой базы данных.
Задание 2. Создать хранимые процедуры для добавления, удаления и корректировки данных одной таблицы.
Задание 3. Создать хранимую процедуру, использующую цикл
WHILE с принудительным выходом из цикла, а также с приостановкой выполнения программы.
Задание 4. Создать хранимую процедуру, выполняющую добавление записей в родительскую и дочернюю таблицы.
Задание 5. Создать хранимую процедуру, удаляющую запись из родительской таблицы и все связанные с ней записи из дочерних таблиц.
Индивидуальные задания
Создать хранимые процедуры c помощью операторов Create
procedure, причем самостоятельно определить имена процедур. Каждая процедура будет выполнять по одному SQL запросу, которые
представлены в виде отдельных заданий по вариантам.
Вариант 1. БД «Учет выданных подарков несовершеннолетним
детям сотрудников предприятия»
Код сотрудника
Код сотрудника Код ребенка
Фамилия
Имя ребенка
Имя
Дата рождения Дата выдачи подарка
Отчество
Код ребенка
Должность
Подразделение
Дата приема на работу
45
Стоимость подарка
Код выдачи
1. Вывести список сотрудников, у которых есть хотя бы один ребенок.
2. Вывести список детей, которым выдали подарки в указанный
период.
3. Вывести список родителей, у которых есть несовершеннолетние дети.
4. Вывести информацию о подарках со стоимостью больше указанного числа, отсортированных по дате.
Вариант 2. БД «Учет выполненных ремонтных работ»
Код прибора в ремонте
Код прибора
Код мастера
Название прибора
Код мастера
Фамилия мастера
Тип прибора
ФИО владельца прибора
Имя мастера
Дата производства
Дата приема в ремонт
Отчество мастера
Вид поломки
Разряд мастера
Стоимость ремонта
Дата приема на работу
код ремонта
1. Вывести список приборов с указанным типом.
2. Вывести количество отремонтированных приборов и общую
стоимость ремонтов у указанного мастера.
3. Вывести список владельцев приборов и количество их обращений, отсортированный по количеству обращений по убыванию.
4. Вывести информацию о мастерах с разрядом больше указанного числа или с датой приема на работу меньше указанной даты.
Вариант 3. БД «Продажа цветов»
Код цветка
Код цветка
Код продавца
Название цветка
Дата продажи
Фамилия
Сорт цветка
Цена продажи
Имя
Средняя высота
Код продавца
Отчество
Тип листа
Код продажи
Разряд
Цветущий
Оклад
Дополнительные сведения
Дата приема на работу
46
1. Вывести список цветков с указанным типом листа.
2. Вывести список кодов продаж, по которым продано цветов на
сумму больше указанного числа.
3. Вывести дату продажи, сумму, продавца и цветок по указанному коду продажи.
4. Вывести список цветов и сорт для цветов с высотой больше
указанного числа или цветущий.
Вариант 4. БД «Поступление лекарственных средств»
Код лекарства
Код лекарства
Код поставщика
Название лекарства
Код поставщика
Сокращенное название
Показания к применению
Дата поставки
Полное название
Единица измерения
Цена за единицу
Юридический адрес
Количество в упаковке
Количество
Телефон
Название производителя
Код поступления
ФИО руководителя
1. Вывести список лекарств с указанным показанием к применению.
2. Вывести список дат поставок, по которым продано больше указанного числа одноименного лекарства.
3. Вывести дату поставки, сумму, ФИО руководителя от поставщика и название лекарства по коду поступления больше указанного
числа.
4. Вывести список лекарств и единицы измерения для лекарств с
количеством в упаковке больше указанного числа или кодом лекарства меньше определенного значения.
Вариант 5. БД «Списание оборудования»
Код оборудования
Код оборудования
Код сотрудника
Название оборудования
Причина списания
Фамилия
Тип оборудования
Дата списания
Имя
Дата поступления
Код сотрудника
Отчество
ФИО ответственного
Код списания
Должность
Место установки
Подразделение
Дата приема на работу
47
1. Вывести список сотрудников с указанной должностью.
2. Вывести список списанного оборудования по указанной причине.
3. Вывести дату поступления, название оборудования, ФИО ответственного и дату списания для оборудования, списанного в указанный период.
4. Вывести список оборудования с указанным типом или с датой
поступления больше определенного значения
Вариант 6. БД «Поваренная книга»
Код блюда
Код блюда
Код продукта
Тип блюда
Код продукта
Название продукта
Вес блюда
Объем продукта
Ед измерения
Порядок приготовления
Количество калорий
Количество углеводов
1. Вывести список блюд с весом больше указанного числа.
2. Вывести список продуктов, в названии которых встречается
указанный фрагмент слова.
3. Вывести объем продукта, название блюда, название продукта с
кодом блюда от указанного начального значения по определенному
конечному значению.
4. Вывести порядок приготовления блюда и название блюда с количеством углеводов больше определенного значения или количеством калорий больше указанного значения.
Вариант 7. БД «Регистрация входящей документации»
Код регистратора
Код документа
Код
организацииотправителя
Фамилия
Номер документа
Сокращенное название
Имя
Дата регистрации
Полное название
Отчество
Краткое содержание докуЮридический адрес
мента
Должность
Тип документа
Дата приема на ра- Код
боту
отправителя
Телефон
организации-
Код регистратора
48
ФИО руководителя
1. Вывести список сотрудников с указанной должностью.
2. Вывести список документов, в содержании которых встречается указанный фрагмент слова.
3. Вывести дату регистрации, тип документа, ФИО регистратора
и название организации для документов, зарегистрированных в указанный период.
4. Вывести список зарегистрированных документов с определенным
типом документа или с датой регистрации больше указанного значения.
Вариант 8. БД «Увольнение сотрудника»
Код сотрудника
Код документа
Код статьи увольнения
Фамилия
Номер документа
Название статьи увольнения
Имя
Дата регистрации
Причина увольнения
Отчество
Дата увольнения
Номер статьи увольнения
Должность
Код статьи увольне- Номер пункта/подпункта увольния
нения
Подразделение
Код сотрудника
Дата приема на ра- Денежная компенсаботу
ция
1. Вывести список сотрудников с указанной причиной увольнения.
2. Вывести список документов с датой регистрации в указанный
период.
3. Вывести дату регистрации, причину увольнения, ФИО сотрудника для документов, зарегистрированных в указанный период.
4. Вывести список зарегистрированных документов с кодом документа в указанном диапазоне.
Вариант 9. БД «Приказ на отпуск»
Код сотрудника
Код документа
Код отпуска
Фамилия
Номер документа
Тип отпуска
Имя
Дата регистрации
Оплата отпуска
Отчество
Дата начала отпуска
Льготы по опуску
Должность
Дата окончания отпуска
Подразделение
Код сотрудника
Дата приема на работу
Код отпуска
49
1. Вывести список сотрудников, бравших отпуск указанного типа.
2. Вывести список документов с датой регистрации в указанный
период.
3. Вывести дату регистрации, тип отпуска, ФИО сотрудника для
документов, зарегистрированных в указанный период.
4. Вывести список зарегистрированных документов с кодом документа в указанном диапазоне.
Вариант 10. БД «Регистрация выходящей документации»
Код отправителя
Код документа
Код
организацииполучателя
Фамилия
Номер документа
Сокращенное название
Имя
Дата регистрации
Полное название
Отчество
Краткое содержание докуЮридический адрес
мента
Должность
Тип документа
Дата приема на ра- Код
боту
получателя
Телефон
организации-
ФИО руководителя
Код отправителя
1. Вывести список сотрудников с указанной должностью.
2. Вывести список документов, в содержании которых встречается указанный фрагмент слова.
3. Вывести дату регистрации, тип документа, ФИО отправителя и
название организации для документов, зарегистрированных в указанный период.
4. Вывести список зарегистрированных документов с указанным типом документа или с кодом документа меньше определенного значения.
Вариант 11. БД «Назначение на должность»
Код сотрудника
Фамилия
Имя
Отчество
Дата приема на работу
Дата рождения
Пол
Код документа
Номер документа
Дата регистрации
Дата назначения
Код сотрудника
Код должности
50
Код должности
Название должности
Льготы по должности
Требования к квалификации
1. Вывести список сотрудников, назначенных на указанную
должность.
2. Вывести список документов с датой регистрации в указанный
период.
3. Вывести дату регистрации, должность, ФИО сотрудника для
документов, зарегистрированных в указанный период.
4. Вывести список зарегистрированных документов с кодом документа в указанном диапазоне.
Вариант 12. БД «Выдача оборудования в прокат»
Код клиента
Код выдачи
Код оборудования
Фамилия
Номер документа
Название оборудования
Имя
Дата начала проката
Тип оборудования
Отчество
Дата окончания проката Дата поступления в прокат
Адрес
Код оборудования
Телефон
Код клиента
Серия и номер паспорта Стоимость
1. Вывести список оборудования с указанным типом.
2. Вывести список оборудования, которое брал в прокат определенный клиент.
3. Вывести список лиц, бравших оборудование в прокат и количество их обращений, отсортированный по количеству обращений по
убыванию.
4. Вывести информацию о клиентах, отсортированных по адресам.
Вариант 13. БД «Списание оборудования из проката»
Код оборудования
Код оборудования
Код сотрудника
Название оборудования
Причина списания
Фамилия
Тип оборудования
Дата списания
Имя
Дата поступления в прокат
Код сотрудника
Отчество
Номер документа
Должность
Дата регистрации
Дата приема на работу
Код списания
51
1. Вывести список оборудования с указанным типом. 2. Вывести
список оборудования, которое списал определенный сотрудник.
3. Вывести количество списанного оборудования, сгруппированного по типам оборудования.
4. Вывести информацию о сотрудниках с датой приема на работу
больше определенной даты.
Вариант 14. БД «Прием цветов в магазин»
Код цветка
Код цветка
Код поставщика
Название цветка
Дата поступления
Сокращенное название
Сорт цветка
Цена за единицу
Полное название
Средняя высота
Код поставщика
Юридический адрес
Тип листа
Код поступления
Телефон
Цветущий
Количество
ФИО руководителя
Дополнительные сведения
1. Вывести список цветков с указанным типом листа.
2. Вывести список кодов поступлений, по которым продано цветов на суммы больше определенного значения.
3. Вывести дату поступления, сумму, названия поставщика и цветов по определенному коду поставщика.
4. Вывести список цветов и сорт для цветов с высотой больше
определенного числа или цветущий.
Вариант 15. БД «Регистрация клиентов гостиницы»
Код номера
Код регистрации
Код клиента
Тип номера
Код номера
Фамилия
Перечень удобств
Дата заезда
Имя
Цена за сутки
Дата выезда
Отчество
Стоимость
Адрес
Код клиента
Телефон
Серия и номер паспорта
52
1. Вывести список клиентов, заехавших в номера в указанный период.
2. Вывести общую сумму оплат за номера для каждого клиента.
3. Вывести дату заезда, тип номера, ФИО клиентов, зарегистрированных в указанный период.
4. Вывести список зарегистрированных клиентов в номерах определенного типа.
53
Практическое занятие №6
УПРАВЛЕНИЕ ДОСТУПОМ В MS SQL SERVER
Цель работы: освоение способов управления доступом в средах
СУБД Microsoft SQL Server.
Темы для предварительной проработки
 Управление доступом в СУБД.
Выполнение работы
 Скооперироваться с кем-то из своих товарищей по группе для
доступа к таблицам друг друга. Ознакомиться со структурой базы
данных своего партнера.
 Подготовить SQL-скрипты для доступа к таблицам своего
партнера.
 соединиться с локальной базой данных.
 Предоставить доступ к локальной базе данных пользователю
test (пароль: test) Для этого надо выполнить следующую команду TSQL: exec sp_grantdbaccess 'test'
 Написать скрипты присвоения новому пользователю прав доступа к таблицам, созданным в практической работе №2. При этом
права доступа к различным таблицам должны быть различными, а
именно:
o по крайней мере, для одной таблицы новому пользователю
присваиваются права SELECT, INSERT, UPDATE в полном
объеме
o по крайней мере, для одной таблицы новому пользователю
присваиваются права SELECT и UPDATE только избранных
столбцов.
o по крайней мере, для одной таблицы новому пользователю
присваивается только право SELECT.
 Присвоить новому пользователю право доступа (SELECT) к
представлению, созданному в практической работе №3.
 Создать стандартную роль уровня базы данных, присвоить ей
право доступа (UPDATE на некоторые столбцы) к представлению,
созданному в практической работе №3, назначить новому пользователю созданную роль.
54
 Соединиться с локальной базой данных под именем нового
пользователя.
Темы для проработки
1. Средства управления доступом в MS SQL Server.
2. Аутентификация и авторизация.
3. Роли и привилегии.
4. Директивы GRANT, DENY и REVOKE.
Контрольные вопросы
1. В чем различия имени входа (логина) и пользователя?
2. Рассказать о ролях уровня сервера.
3. Рассказать о ролях уровня базы данных.
4. Можно ли создать свою роль уровня сервера?
5. Для чего нужны роли?
6. Что такое схема?
7. Рассказать о роли уровня базы данных public.
8. Рассказать про директивы GRANT, DENY и REVOKE.
9. Как разрешить пользователю предоставлять разрешение другим пользователям?
10. Как добавить нового пользователя в текущую базу данных?
11. Как создать новый логин?
55
Список литературы
1. Хомоненко А. Д., Цыганков В. М., Мальцев М. Г. Базы данных:
Учебник для высших учебных заведений / Под ред. проф. А. Д. Хомоненко. – 5-е изд., доп. – М.: Бином-Пресс; СПб.: Корона принт, 2006. –
736 с.
2. Кузнецов С. Д. Основы баз данных: учеб. пособие / С. Д. Кузнецов. – 2-е изд., испр. – М.: Интернет-Университет Информационных
Технологий: БИНОМ. Лаборатория знаний, 2010. – 484 с.
3. Бейли Л. Изучаем SQL / Л. Бейли. – М. [и др.]: Питер, 2012. –
582 с.
4. Байдачный С., Маленко Д. , Лозинский Ю. SQL Server 2005:
Новые возможности для разработчиков. – М.: СОЛОН-Пресс, 2006. –
208 с: ил.
5. Семенова И. И. SQL стандарт в СУБД MS SQL Server, Oracle,
VFP и Access: манипулирование данными. – Омск: Изд-во СибАДИ,
2008. – 57 с.
6. Маклаков С. В. BPwin и ERwin CASE – средства разработки
информационных систем. – М.: ДИАЛОГ-МИФИ, 2000. – 254 с.
7. Советов Б. Я. Базы данных: теория и практика: [Учеб. для вузов. Рекомендовано УМО] / Б. Я. Советов, В. В. Цехановский, В. Д.
Чертовский. – 2-е изд., стер. – М.: Высш.шк., 2007. – 462 с.
8. http://www.citforum.ru
9. Методические материалы сайта http://bdis.umeta.ru/db
56
Приложение
Структура и описание таблиц БД DB_BOOKS.
Покупки (название таблицы Purchases)
Название поля
Code_book
Date_order
Code_delivery
Type_purchase
Cost
Amount
Code_purchase
Тип поля
Int
DateTime
Int
Bit
Money
Int
Int
Описание поля
Код закупаемой книги
Дата заказа книги
Код поставщика
Тип закупки (опт/ розница)
Стоимость единицы товара
Количество экземпляров
Код покупки
57
Справочник книг (название таблицы Books)
Название поля
Code_book
Title_book
Code_author
Pages
Code_publish
Тип поля
Int
Char
Int
Int
Int
Описание поля
Код книги
Название книги
Код автора
Количество страниц
Код издательства
Справочник авторов (название таблицы Authors)
Название поля
Code_author
Name_author
Birthday
Тип поля
Int
Char
DateTime
Описание поля
Код автора
Фамилия, имя, отчество автора
Дата рождения
Справочник поставщиков (название таблицы Deliveries)
Название поля
Code_delivery
Name_delivery
Name_company
Address
Phone
INN
Тип поля
Int
Char
Char
Char
Numeric
Char
Описание поля
Код поставщика
Фамилия, и., о. ответственного лица
Название компании-поставщика
Юридический адрес
Телефон контактный
ИНН
Справочник издательств (название таблицы Publishing_house)
Название поля
Code_publish
Publish
City
Тип поля
Int
Char
Char
58
Описание поля
Код издательства
Издательство
Город
Download