МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ имени ШАКАРИМА г. СЕМЕЙ Документ СМК 3 уровня УМКД УМКД 042-39. 1.ХХ/032013 УМКД Редакция №____от_____ Учебно-методические материалы по дисциплине «Администрирование и проектирование баз данных MS SQL Server» УЧЕБНО-МЕТОДИЧЕСКИИ КОМПЛЕКС ДИСЦИПЛИНЫ «Администрирование и проектирование баз данных MS SQL Server» для специальности 6М060200 – «Информатика » УЧЕБНО-МЕТОДИЧЕСКИЕ МАТЕРИАЛЫ Семей 2014 СОДЕРЖАНИЕ 1 Глоссарий 2 Лекции 3 Практические и лабораторные занятия 4 Самостоятельная работа обучаемого 1. ГЛОССАРИЙ SQL Server 2008 — это реляционная СУБД, которая использует язык Transact-SQL для пересылки сообщений между компьютером клиента и компьютером, на котором работает SQL Server 2008. Transact-SQL — это язык, команды которого позволяют администрировать SQL Server, создавать любые его объекты и управлять ими, а также добавлять, извлекать, модифицировать и удалять данные из таблиц SQL Server. Transacl-SQL представляет собой расширение языка, определенного стандартами SQL, которые опубликованы ISO и ANSI. XML — это стандарт форматирования данных, принятый в Интернете. Он представляет набор тэгов, которые включают в документ, чтобы определить его структуру. Хотя большинство операторов SQL возвращают результаты в виде реляционного набора данных (в табличном виде), SQL Server 2000 поддерживает оператор FOR XML, который задает возврат результатов в виде документа XML. SQL Server 2000 также поддерживает запросы XPath из приложений для Интернета и интрасетей. Импорт — это процесс получения данных из внешних по отношению к SQL Server источников (например, из текстового файла ASCII) и размещение их в таблицах SQL Server. Интернет-приложение передает механизму баз данных оператор SQL или запрос XPath, а тот возвращает результат в виде документа XML. Механизм реляционных баз данных обеспечивает поддержку стандартных интерфейсов доступа к данным, таких, как ADO, OLE DB и ODBC. Механизм реляционных баз данных SQL Server 2000 — это современное ядро с высокой степенью масштабируемости, предназначенное для хранения данных. Механизм баз данных сохраняет данные в таблицах. Приложение передает механизму баз данных оператор SQL, механизм возвращает результат в виде набора данных в табличной форме. Пакет — это группа из одного или нескольких операторов Transact-SQL, которые приложение одновременно посылает на SQL Server для исполнения. SQL Server компилирует операторы пакета в единую исполнимую единицу (план исполнения). После этого по очереди выполняются операторы этого плана. Подзапросом называется возвращающий единственное значение оператор SELECT, вложенный в другой оператор SELECT, INSERT, UPDATE, DELETE или в другой подзапрос. Подзапрос разрешается применять в любом месте, где разрешено использование выражения. Подзапрос также называется внутренним запросом или внутренней выборкой, а содержащий подзапрос оператор — внешним запросом или внешней выборкой. Реляционная СУБД состоит из механизма баз данных, собственно баз данных и приложений, необходимых для управления данными и компонентами реляционной СУБД. Реляционная СУБД организует данные в виде связанных строк и столбцов, составляющих базу данных. Хранимая процедура — это группа операторов TransactSQL, которая компилируется один раз и после этого может выполняться многократно. Триггер — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно. При создании триггера определяются условия его исполнения: триггер должен быть исполнен при определенной модификации данных в заданной таблице или столбце. Экспорт — это извлечение данных из экземпляра SQL Server в определенном заданном пользователем формате (например, копирование содержимого таблицы SQL Server в базу данных Microsoft Access). 2. ЛЕКЦИИ Лекция № 1 Тема: Введение в теорию баз данных Цель: выявить основные структурные элементы баз данных и основные принципы, используемые при их разработке. Основные понятия Существуют различные определения понятия база данных (БД). Чаще всего под БД понимается поименованная совокупность структурированных данных, относящихся к некоторой предметной области. Однако в этом случае БД весьма трудно отличить от обычной картотеки или архива документов. Можно выделить три свойства, которые отличают БД от простой совокупности данных: 1. БД хранится и обрабатывается в вычислительной системе. 2. Данные в БД хорошо структурированы, т.е. выделены основные элементы, их типы и связи между элементами, а также ограничения на допустимые операции. 3. Обеспечивается поиск и обработка данных. Наиболее распространенным типом БД являются реляционные базы данных. Рассмотрим основные структурные элементы реляционной БД: 1. Поле – элементарная единица организации данных. Для описания поля используют характеристики: имя, тип, длина, точность и т.д. Соответствует столбцу в таблице. 2. Запись – совокупность логически связанных полей. Соответствует строке в таблице. 3. Собственно таблица (отношение). Система баз данных Система баз данных (СБД) – это компьютеризированная система структурированных данных, основная цель которой хранение информации и предоставление ее по требованию. Различают однопользовательские и многопользовательские системы. Однопользовательская система (Single-user system) – это система, в которой в одно и то же время к БД может получить доступ только один пользователь. Многопользовательская система (Multi-user system) – это система, в которой в каждый момент времени к БД могут получить доступ несколько пользователей. Основная задача такой системы – позволить пользователю работать с БД как с однопользовательской. Обычно в СБД выделяют четыре основных элемента: 1. 2. 3. 4. Данные. Аппаратное обеспечение. Программное обеспечение (ПО). Пользователи. Упрощенная схема СБД представлена на рис. 1.1. База данных Прикладные Конечные программы пользовател и Рис. 1.1. Элементы системы баз данных Данные Данные в БД можно охарактеризовать как интегрированные и общие. Интегрированные данные можно представить как объединение нескольких отдельных файлов, полностью или частично неперекрывающихся. В случае общих данных отдельные области данных можно использовать нескольким различным пользователям. Аппаратное обеспечение К нему относятся: накопители для хранения информации вместе с устройствами ввода/вывода; процессор вместе с основной памятью, которая используется для поддержки работы ПО системы. Программное обеспечение Основная часть ПО – это система управления базами данных, СУБД (DBMS – DataBase Management System – диспетчер БД). Основная функция СУБД – предоставление пользователю возможности работать с БД, не вникая в детали на уровне аппаратуры. СУБД поддерживает пользовательские операции высокого уровня. К таким операциям относятся и операции, выполняемые с помощью языка SQL (Structured Query Language, структурированный язык запросов) – специального языка БД. СУБД хотя и основной, но не единственный программный компонент системы, среди других можно назвать утилиты, средства разработки приложений, генераторы отчетов и другие. Пользователи Различают три группы пользователей СБД: 1. Прикладные программисты. Для целей разработки прикладных программ, которые используют базы данных, применимы различные языки и среды программирования: Visual Basic, C++, Java, C# и другие. Прикладные программы получают доступ к базе данных посредством выдачи соответствующего запроса к СУБД (обычно это операторы SQL). 2. Конечные (рядовые) пользователи. Конечный пользователь может получать доступ к базе данных, применяя одно из интерактивных приложений. Многие СУБД предоставляют не только средства для выполнения запросов SQL, но и графические утилиты, позволяющие создавать запросы без знания SQL. 3. Администраторы БД. Занимаются управлением работы сервера БД. Организация данных в БД В базе данных выделяют следующие элементы: данные; объекты; связи; свойства. Данные В БД данные обычно называют постоянными, хотя они конечно не являются таковыми в общепринятом понимании. Так их назвали в сравнении с изменчивыми данными – транзитными (промежуточные результаты, входные, выходные данные). Входные данные – это информация, передаваемая системе с терминала или рабочей станции. Когда эта информация сохранена в таблицах, она становится частью постоянных данных или влечет за собой изменения постоянных данных. Выходные данные – это сообщения и результаты, выдаваемые системой на экран, печать и иное устройство вывода. Объекты В реляционных БД это таблицы (другое название – отношения), описывающие некоторые объекты реального мира. Реляционные базы данных хранят все данные только в таблицах. Связи Связи отображают зависимости между объектами. Как правило, они бывают двусторонними. Допустим, есть два объекта Students и Groups, по связи между ними можно ответить на два вопроса: 1) какой группе принадлежит данный студент; 2) какие студенты входят в данную группу. Схема, на которой представлены объекты и их связи, называется Схема объект-отношение или Диаграмма объект-отношение (рис. 1.2.). Рис. 1.2. Связь между таблицами Students и Groups В схеме могут быть связи, указывающие на один и тот же тип объекта. Например, преподаватель является наставником молодого преподавателя. В конкретном наборе объектов может быть любое количество связей. Между двумя таблицами может быть более одной связи. Свойства Все объекты и связи имеют определенные свойства. Свойства объектов выражаются полями таблицы. Свойства связей выражаются в их характеристиках при формировании. Виды моделей данных Ядром любой БД является модель данных. Модель данных – это совокупность структуры данных и операций их обработки. Кратко рассмотрим основные виды моделей данных и выявим их основные преимущества и недостатки, при этом будем учитывать факторы, характеризующие принципиальные особенности моделей, а также факторы, связанные с реализацией этих моделей на ЭВМ. 1. Иерархическая модель данных. Представляет собой совокупность элементов, связанных по строго определенным правилам. Объекты, связанные иерархическими отношениями образуют ориентированный граф. Основными понятиями иерархической модели данных являются: уровень, узел (или элемент) и связь. Такая модель данных обладает следующими свойствами: каждый узел связан только с одним вышестоящим узлом, кроме вершины; иерархическая модель данных имеет только одну вершину, узел не подчинен более никаким узлам; от каждого узла существует единственный путь к вершине; связь не может быть установлена между объектами, находящимися через уровень; связь между узлами первого уровня не определяется. Примеры. 1) Файловая структура организации информации. 2) Структура организации (директор, заместитель, руководители отделов, сотрудники) (рис.1.3). Директор Руководитель Руководитель Руководитель отдела продаж PR-отдела отдела Сотрудни к Сотрудни Сотрудни Сотрудни обслуживания Сотрудни к к к к Рис. 1.3. Иерархическая структура данных Преимущества: 1. Простота. 2. Минимальный расход памяти. Недостатки: 1. Отсутствие универсальности – не всякую информацию можно выразить в иерархической модели данных. 2. Исключительно навигационный принцип доступа к данным. 3. Доступ к данным только через корневой элемент. 2. Сетевая модель данных. Элементами этой модели являются: уровень, узел, связь. Отличия в том, что элемент одного уровня может быть связан с любым количеством элементов соседнего уровня, и не существует подчиненности уровней друг другу. Свойства сетевой модели: связь не может быть установлена между объектами, находящимися через уровень; связь между узлами первого уровня не определяется. Пример. Рассмотрим работу над проектами: можно выделить три вида объектов – сотрудники, проекты, заказчики (рис.1.4). Сотрудник 1 Сотрудник 2 Проект 1 Проект 2 Заказчик 1 Заказчик 2 Сотрудник 3 Сотрудник 4 Проект 3 Заказчик 3 Заказчик 4 4 Рис. 1.4. Сетевая структура данных Преимущества: 1. Универсальность. 2. Возможность доступа к данным через значения нескольких отношений. Недостатки: 1. Сложность – обилие понятий, вариантов их взаимосвязей и способов реализации. 2. Допустимость только навигационного принципа доступа к данным. 3. Реляционная модель данных (табличная). Это способ представления данных в виде таблиц. Элементы: поле (столбец), запись (строка) и таблица (отношение). В дальнейшем мы будем рассматривать именно реляционную модель данных, которая используется в реляционных системах. Под реляционной системой понимается система, основанная на следующих принципах: данные пользователя представлены только в виде таблиц; пользователю предоставляются операторы, генерирующие новые таблицы из старых (для выборки данных). Пример. Рассмотрим отношения Студенты и Группы: Students: StudentID LastName 1 Казаков 2 Васильев 4 Шишкина FirstName Петр Иван Дарья Groups: GroupID 1 Царев С.М. 2 Пестов Д.Н. MiddleName Владимирович Аркадьевич Сергеевна GroupID 1 2 1 Supervisor Преимущества: 1. Простота. В такой модели всего одна информационная конструкция, формализующая табличное представление. Она наиболее привычна для пользователя. 2. Теоретическое обоснование. Существуют строгие методы нормализации данных в таблицах (будет подробно рассмотрено в лекциях 1011). 3. Независимость данных. При изменении БД, ее структуры необходимы бывают лишь минимальные изменения прикладных программ. Недостатки: 1. Низкая скорость, т.к. требуются операции соединения. 2. Большой расход памяти в силу организации всех данных в виде таблиц. 4. Система инвертированных списков – система индексов. Систему инвертированных списков можно рассматривать как частный случай сетевой модели данных, которая имеет два уровня. Основные элементы: основной файл, инвертированный список (файл), список связей. В такой системе имеется несколько основных файлов, имеющих единую сквозную нумерацию. Пример. Рассмотрим объекты Сотрудники и Зарплата. Сотрудники: Сотрудник 01 Иванов 02 Сидоров 03 Шишкин 04 Васильев Должность программист лаборант преподаватель преподаватель Зарплата: Сотрудник 05 Иванов 06 Сидоров 07 Иванов 08 Шишкин 09 Васильев 10 Васильев Дата 1.10.2008 5.10.2008 3.12.2008 3.12.2008 25.01.2009 27.01.2009 Сумма 5000 7500 10000 8000 5000 8750 Инвертированный список может быть сформирован по любому полю основных списков, в нем каждому значению сопоставляется список номеров (индексов). Пример: инвертированный список Должность: программист – 01; лаборант – 02; преподаватель – 03, 04 Список связей составляется только по основным столбцам. Пример: рассмотрим два списка связей: Сотрудники – Зарплата: o 01 – 05, 07 o 02 – 06 o 03 – 08 o 04 – 09, 10 Зарплата – Сотрудники: o 05 – 01 o 06 – 02 o 07 – 01 o 08 – 03 o 09 – 04 o 10 – 04 Инвертированные списки являются основой для создания информационно-поисковых систем (ИПС). В ИПС ключевые атрибуты соответствуют ключевым словам, определяющим тематику поиска. Так как недостатки реляционной модели данных компенсируются ростом быстродействия и ресурсов современных компьютеров, то в настоящее время именно такие модели получили наибольшее распространение. Архитектура БД Существует архитектура БД, предложенная исследовательской группой ANSI/SPARC1 и называется архитектурой ANSI/SPARC. Каждая система баз данных не обязана соответствовать этому определению, например, «малые» системы, весьма вероятно, не будут поддерживать все функции предложенной архитектуры. Тем не менее, рассматриваемая архитектура с достаточной точностью описывает большинство систем (и не только реляционных). Принято выделять три уровня в архитектуре СУБД. 1. Внутренний уровень (называемый также физическим) наиболее близок к физическому хранилищу информации, т.е. связан со способами хранения информации на физических устройствах. Внутренний уровень отображает физические элементы для хранения информации. Он представляет собой бесконечное адресное пространство, из которого информация проецируется на внешние носители. 2. Внешний уровень (называемый также пользовательским) наиболее близок к пользователям, т.е. связан со способами представления данных для отдельных пользователей (прикладной программист или конечный пользователь). Для каждого пользователя может существовать свой язык СУБД. Для прикладного программиста – это язык программирования, а для конечного пользователя – это язык, основанный на меню, формах и т.д. Но все эти языки включают язык данных, встроенный в СУБД. Для каждого отдельного пользователя может быть интересна некоторая отдельная часть БД. Такие части, с которыми работает пользователь, называются внешним представлением. 3. Концептуальный уровень (называемый также логическим) является «промежуточным» уровнем между двумя первыми. Это представление всей информации БД в более абстрактной форме. На этом уровне хранятся собственно данные, независимые от формы их представления. Концептуальное представление состоит из множества экземпляров данных. Данные здесь представлены в виде концептуальной схемы. Кроме самих данных в эту схемы могут быть включены определения дополнительных средств, например, правила обеспечения целостности. Подробная схема архитектуры системы баз данных представлена на рис. 1.5. 1 ANSI/SPARC (American National Standards Institute / Standards Planning and Requirements Committee – Американский национальный институт стандартов / Комитет планирования стандартов) – исследовательская группа в рамках Американского национального института стандартов. Архитектура ANSI/SPARC была предложена в 1975 году. Внешний уровень Концептуальный уровень Пользователь Пользователь Пользователь 1 2 3 Внешнее Внешнее представление представление 1 2 Концептуальное представление Внутренний уровень Рис. 1.5. Уровни архитектуры систем баз данных Классификация БД Базы данных классифицируют по различным признакам, рассмотрим основные из них. 1. По технологии обработки. Централизованные. Хранятся в памяти одной вычислительной системы. Распределенные. Состоят из нескольких, возможно пересекающихся частей, хранящихся в различных узлах вычислительной сети. 2. По способу доступа к данным. С локальным доступом. Характеризуется тем, что к такой БД имеется доступ пользователя одной ЭВМ. С удаленным (сетевым) доступом. Доступно для всех пользователей сети. 3. По архитектуре. Файл-сервер. Предполагает выделение одной машины в сети в качестве центральной (сервер файлов), на ней хранится централизованная БД, которая используется совместно. Клиент-сервер. Предполагается выделение сервера БД, который кроме хранения осуществляет обработку данных. Систему БД можно рассматривать как систему, состоящую из двух частей: сервер и набор клиентов. Сервером БД называется собственно СУБД, а клиентами – различные приложения, которые выполняются над СУБД. 4. По содержимому. Географические. Исторические. Научные. Мультимедийные. и т.д. Краткие итоги. Рассмотрены основные понятия баз данных, представлены различные классификации систем управления базами данных. Определены основные модели данных, которые используются в конкретных реализациях СУБД: иерархическая, сетевая, реляционная и система индексов. Лекция № 2 Тема: Компоненты Microsoft SQL Server 2008 Цель: определить основные компоненты Microsoft SQL Server 2008 и продемонстрировать их основные возможности. Microsoft SQL Server 2008 Microsoft SQL Server – это система управления клиент-серверными реляционными базами данных, ориентированная на работу под управлением операционных систем Microsoft Windows. Microsoft SQL Server 2008 (MS SQL Server) поддерживает операционные системы Windows Server 2003, Windows Server 2008, Windows XP, Windows Vista. MS SQL Server включает в себя как серверную, так и клиентскую часть. Однако состав служб, включенных в поставку сервера, зависит от версии. MS SQL Server 2008 доступен в шести версиях (редакциях): Enterprise Edition. Версия с максимальными возможностями для применения в крупных системах. Сюда включены более 60-ти функций, недоступных в других версиях, например: сжатие данных и резервных копий, аудит с использованием расширенного набора событий, утилита для управления ресурсами Resources Governor, возможность горячей замены процессора. Standard Edition. Предназначена для использования в системах среднего уровня, где не требуются возможности Enterprise версии. Предоставляет базовые возможности по аналитике и созданию отчетов. Workgroup Edition. Подходит для установки в филиалах компании и предоставляет средства управления данными, создания отчетности, удаленной синхронизации и управления. Web Edition. Ориентирована на работу в Интернете, позволяет предоставлять клиентам доступ к крупномасштабным веб-приложениям. Express Edition. Бесплатная версия. Подходит для обучения, для создания настольных и небольших серверных приложений, а также для распространения независимыми производителями ПО. Compact Edition. Бесплатная версия. Позволяет создавать автономные или мало связанные приложения для мобильных устройств, настольных ПК и веб-клиентов, работающих под управлением любых версий Microsoft Windows. Серверная часть системы MS SQL Server реализуется в виде нескольких самостоятельных служб, каждая из которых отвечает за выполнение определенных задач. Служба SQL Server (MSSQLServer) является ядром этой СУБД, от ее функционирования зависят все остальные службы. Выполняет следующие основные функции: o распределяет ресурсы компьютера между пользователями, одновременно работающими с системой; o управляет файлами баз данных и журналами транзакций; o выполняет команды языка Transact-SQL (рассматривается в лекции 3), запросы и хранимые процедуры (рассматриваются в лекциях 4 и 5 соответственно), указываемые пользователями; o обеспечивает безопасность системы (например, осуществляет проверку учетных записей пользователей; система безопасности рассматривается в лекции 6); o отвечает за согласованность и целостность данных, предотвращая логические проблемы. Замечание. Если данная служба не запущена, то никакие пользователи не могут подключиться к серверу и никакие административные задачи не могут быть выполнены! Служба SQL Server Agent отвечает за автоматическое исполнение назначенных администратором заданий, выполняет отслеживание определенных событий и сопоставленных им заданий (например, создание резервных копий, отправка сообщения администратору о возникшей проблеме и т.п.). Служба Full-Text Filter Daemon позволяет реализовать поиск символьной информации в полях таблиц баз данных. С помощью этой службы осуществляется поиск слов и фраз, причем в результате могут быть отражены склоняемые формы глаголов и существительных. Служба Integration Services заменяет службу DTS SQL Server 2000 и позволяет выполнять следующее: o отслеживать выполнение всех пакетов служб Integration Services, выполняющихся на компьютере; o отображать в иерархическом виде пакеты и папки служб Integration Services, которые физически хранятся в разных местах. Служба Analysis Services – ядро сервера OLAP2, позволяет создавать аналитические приложения с миллионами строк данных и тысячами пользователей. Служба Reporting Services – эта служба представляет серверный компонент, который отвечает за генерацию отчетов, предоставление их пользователям, выполнение различных служебных операций с отчетами. Служба SQL Server Browser предназначена для формирования списка доступных в сети SQL-серверов. Клиентская часть системы MS SQL Server поддерживает множество различных типов клиентов, каждый из которых может работать на своей аппаратной и программной платформе. В комплект поставки MS SQL Server входят стандартные утилиты, которые могут использоваться для управления работой сервера и создания логической структуры баз данных, поддерживаемых им. Для разработки клиентского приложения могут быть использованы и различные средства разработки приложений, например, среды визуального программирования Visual Studio .Net 2003-2008, Visual Basic, Delphi и др. К стандартным утилитам администрирования относятся следующие приложения. SQL Server Configuration Manager Предоставляет следующие возможности: по управлению работой всех служб MS SQL Server, рассмотренных выше. Можно запустить, приостановить или полностью остановить любую из описанных выше служб, а также указать, от имени какого пользователя ее следует запускать. По определению параметров сетевых библиотек, которые обеспечивают взаимодействие с MS SQL Server. Можно выбрать один или сразу несколько методов доступа к серверу: o именованные каналы (Named Pipes) – технология похожа на использование сокетов, применяется в случае недоступности протоколов TCP/IP; o стек протоколов TCP/IP (используется по умолчанию) – подходит для использования через сеть Интернет; o разделяемая память (Shared Memory) – подходит для локального использования, например, веб-приложение и MS SQL Server находятся на одном компьютере. Обеспечивает максимальную скорость работу; 2 OLAP – On-Line Analytical Processing – оперативная аналитическая обработка. o виртуальный интерфейсный адаптер (Virtual Interface Adapter, VIA) – используется для подключений типа сервер-сервер с применением специализированного оборудования. По конфигурированию сетевых библиотек клиента, используемых для доступа к MS SQL Server. После настройки методов доступа к серверу, можно произвести конфигурацию клиентских протоколов. Узел SQL Native Client 10.0 Configuration содержит два раздела: Client protocols и Aliases (рис. 2.1). Рис. 2.1. Окно утилиты SQL Server Configuration Manager Начиная с MS SQL Server 2000, появилась возможность подключения к серверу при помощи нескольких протоколов, например, сначала пытаемся подключиться через Shared Memory, если не получилось, то через TCP/IP, и в последнюю очередь через Named Pipes. Для определения порядка использования протоколов используется свойство Order. Узел Aliases позволяет создавать псевдонимы для подключения к серверу. Псевдоним (Alias) – это альтернативное имя соединения, которое может отличаться от имени сервера. При создании псевдонима можно выбрать протокол и порт, через которые следует подключаться к серверу. SQL Server Management Studio Утилита Management Studio позволяет выполнять следующее: управлять настройками MS SQL Server; конфигурировать систему безопасности: управление ролями, учетными записями, удаленными серверами; работать со структурой баз данных: создавать, редактировать и удалять БД и элементы БД; управлять выполнением заданий по расписанию; показывать текущую активность: текущие пользователи, какие объекты заблокированы, информацию о производительности. Перед началом работы с сервером необходимо подключиться к нему, указав следующую информацию: Server Type. Здесь следует выбрать, к какой именно службе необходимо подключится: Database Engine, Analysis Services, Report Server или Integration Services. SQL Server. Позволяет указать, к какому серверу будет осуществляться подключение. По умолчанию имя SQL Server совпадает с именем компьютера. Authentication Type – способ аутентификации, можно выбрать Windows Authentication или SQL Server Authentication. Способ Windows Authentication использует учетную запись, под которой текущий пользователь осуществил вход в Windows (рис. 2.2). SQL Server Authentication использует свою собственную систему безопасности. Рис. 2.2. Окно соединения с SQL-сервером Редактор запросов (Query Editor) Для того чтобы написать новый запрос к базе данных, необходимо выполнить команду New Query, расположенную на панели инструментов Management Studio. В результате откроется новая вкладка, в которой можно писать SQL-код (см. рис. 2.3). Выполним следующий запрос (язык написания запросов будет освещен в лекциях 3 и 4): SELECT * FROM INFORMATION_SCHEMA.TABLES; Замечание: Для выполнения запроса необходимо выполнить команду Query – Execute (F5). Чтобы просто проверить правильность синтаксической записи можно воспользоваться командой Query – Parse (Ctrl+F5), при этом сам запрос не будет выполнен. Рис. 2.3. Главное окно приложения Management Studio с окном Редактора запросов Теперь будет доступно следующее: заголовок, в котором указывается логическое имя сервера, текущая база данных и имя пользователя, установившего соединение; область запроса, используемая для ввода запросов, передаваемых MS SQL Server; область результатов, в которой отображаются результаты выполнения запроса. Способы отображения результатов могут быть следующими: o Results in Text – результаты выводятся в виде обычного текста. o Results in Grid – результат выводится в виде таблицы, в которой можно изменять ширину столбцов, выделять нужные ячейки/строки/столбцы. o Results to File – аналогично Results in Text, только вывод осуществляется не на экран, а в файл. Management Studio позволяет открывать несколько окон запросов и работать с несколькими базами данных одновременно. В каждом окне устанавливается собственное соединение с MS SQL Server, которое описано в SQL Server Configuration Manager, на основе различных учетных записей пользователей и их паролей. Для создания нового подключения используется команда File – New – Database Engine Query. Содержимое области запроса текущего подключения может быть сохранено в файле на внешнем носителе командой File – Save. Object Explorer Позволяет осуществлять навигацию по базе данных: просматривать доступные объекты, выполнять запросы на просмотр содержимого таблиц, создавать скрипты для объектов и т.д. (рис. 2.4). Рис. 2.4. Панель Object Explorer Выпадающий список баз данных База данных, выбранная в этом списке, используется в редакторе запросов как база данных по умолчанию (см. рис. 2.5). Поэтому важно перед выполнением запросов, убедиться, что выбрана нужная БД. Это можно сделать либо через выпадающий список, либо при помощи команды SQL: USE AdventureWorks2008 Рис. 2.5. Окно выбора текущей базы данных Reporting Services Configuration Используется для конфигурации служб отчетов. MS SQL Server 2008 включает в себя встроенный web-сервер, поэтому нет необходимости в установке и настройке служб интернет-серверов IIS (Internet Information Services). Для создания отчетов используется Report Definition Language (RDL) – язык, основанный на XML3. Bulk Copy Program Утилита командной строки, предназначенная для переноса форматированных данных большого объема в MS SQL Server или из него. Например, отформатированные данные могут быть автоматически перенесены из обычного текстового файла в таблицу MS SQL Server. SQL Server Profiler Позволяет в реальном времени отслеживать выполнение всех команд. Профайлер может находить «узкие» места в базе данных, определять запросы, которые долго выполняются, и наиболее часто выполняемые запросы. Утилита sqlcmd XML (eXtensible Markup Language – расширяемый язык разметки) – текстовый формат, предназначенный для хранения структурированных данных. 3 Утилита командной строки, которая позволяет выполнять SQL-скрипты. Данная утилита может оказаться намного эффективнее, чем Management Studio, когда не требуется графический пользовательский интерфейс. SQL Server Integration Services (SSIS) Позволяет легко извлекать данные из любых источников через механизм OLE DB4 или провайдеров данных .NET и помещать их в таблицы MS SQL Server. Во время переноса данных к ним может быть применена трансформация. SQL Server Business Intelligence Development Studio Представляет особую версию Visual Studio и позволяет создавать пакеты для Integration Services, отчеты для Reporting Services и работать с проектами Analysis Services. Конфигурация MS SQL Server Конфигурирование работы службы MSSQLServer может быть выполнено либо специальной хранимой процедурой, выполняемой в утилите Management Studio, либо графическим способом средствами этой же утилиты. Выбор способа не имеет значения, т.к. графический способ осуществляет доступ к системным данным с помощью этой же хранимой процедуры, только в более наглядной форме. Для изменения параметров службы с помощью Management Studio необходимо выбрать нужный сервер и в контекстном меню выбрать команду Properties, и в появившемся диалоговом окне выполнить конфигурирование сервера. На вкладке General отображаются основные сведения о системе: версия операционной системы, объем памяти, количество процессоров и др., а также параметры запуска служб сервера. Вкладка Memory позволяет управлять выделением памяти для выполнения действий MS SQL Server: либо динамическое управление памятью, либо установка фиксированного размера. Вкладка Processors позволяет управлять тем, на каких процессорах можно выполнять запросы SQL. С помощью вкладки Security определяется тип аутентификации пользователей, также определяются параметры аудита доступа к серверу. Можно настроить сервер на использование определенной учетной записи, под которой будет запускаться служба MSSQLServer. 4 OLE DB (Object Linking and Embedding, Database – внедрение и связывание объектов в базах данных) – набор интерфейсов, которые позволяют приложениям обращаться к данным из различных источников. Вкладка Connections позволяет конфигурировать клиентские подключения к серверу. Если параметр равен 0, то разрешается подключение максимального количества пользователей – 32767 подключений. С помощью вкладки Database Settings указываются настройки вновь создаваемых баз данных: параметры индексов и работы с устройствами резервного копирования, время восстановления базы данных. Вкладка Advanced содержит некоторые общие установки сервера. Например, определяется язык по умолчанию для сообщений сервера или регулируется поддержка 2000 года, которая определяет, как будут интерпретироваться две последние цифры года. Вкладка Permissions позволяет управлять именами входа и ролями, а также управлять правами на выполнение действий в MS SQL Server. Системные базы данных База данных обычно представляет собой совокупность таблиц и других объектов, таких как представления, хранимые процедуры и другие. MS SQL Server 2008 содержит четыре системные базы данных: master; model, msdb. tempdb. Все эти базы данных необходимы для корректной работы сервера. Без некоторых из них работа MS SQL Server и вовсе будет невозможна. Рассмотрим назначение каждой системной базы данных. БД master Любой SQL сервер независимо от версии содержит БД master, в которой фиксируется всё, что происходит в системе. Например, при создании новой БД добавляется запись в таблицу sys.databases БД master. Также все системные хранимые процедуры находятся в этой БД. Поскольку практически все, что описывает MS SQL Server, хранится здесь, то эта БД критически важна и не может быть удалена. БД model Данная БД используется как шаблон для создания любой новой базы данных. Таким образом, можно внести изменения в эту БД, чтобы создаваемые вновь базы содержали нужные изменения. Например, можно добавить группу пользователей, которая должна быть по умолчанию во всех новых БД. Поскольку model используется в качестве шаблона, то она обязательно должна присутствовать для нормального функционирования сервера. Кроме того, следует иметь в виду, что новые БД должны иметь размер не меньше, чем БД model. БД msdb В этой БД служба SQL Server Agent хранит все системные задачи. Например, если задано резервирование по расписанию, то в msdb появится специальная запись. Аналогичным образом данную БД используют и другие подсистемы MS SQL Server, например, SQL Server Integration Services. БД tempdb Фактически tempdb является рабочей областью для MS SQL Server. Например, если исполняется большой сложный запрос, для выполнения которого MS SQL Server требуется создать временную таблицу, то такая таблица будет создана в БД tempdb. То же самое произойдет и в случае, если пользователь сам создает временную таблицу, хотя пользователю может казаться, что он создает ее в текущей базе. В отличие от других БД, msdb и сама является временной: она воссоздается каждый раз заново при запуске MS SQL Server. Краткие итоги. Рассмотрены службы MS SQL Server 2008, обеспечивающие как базовую функциональность, так и дополнительную: средства отчетов, интеграции и т.д. Дана характеристика системных баз данных и основное их назначение. Лекция № 3 Тема: Общие сведения о Transact-SQL Цель: дать представление об основных возможностях языка TransactSQL. Общие сведения о Transact-SQL В 1970-х годах был разработан специальный язык SEQUEL (Structured English Query Language), который позднее был переименован в SQL. В 1986 году комитетом ANSI (American National Standards Institute) был принят первый стандарт языка. Последним принятым стандартом является ISO SQL:2008. Язык SQL разрабатывался как непроцедурный язык, который будет доступен обычным пользователям, а не только программистам. Однако со временем язык становился все сложнее и сейчас предназначен в большей степени для программистов. Несмотря на существование стандартов языка SQL, в каждой СУБД используется свое расширение этого языка. Основной причиной использования расширений SQL является потребность применять SQL не только как язык запросов, но и как язык программирования, для этого, как правило, вводятся так называемые хранимые процедуры. СУБД Microsoft SQL Server использует свое расширение языка, которое называется TransactSQL и включает в себя следующее: управляющие конструкции; локальные переменные; дополнительные функции (математические, строковые и другие); поддержка аутентификации Windows. Типы данных MS SQL Server поддерживает все основные простые типы данных, используемые в современных языках программирования. В версии MS SQL Server 2008 были добавлены несколько новых типов, а некоторые перестали рекомендоваться к использованию. Типы данных в MS SQL Server можно разделить на семь категорий. 1. Целые числа: Bit (1 байт). На самом деле первый бит в таблице будет занимать один байт, однако следующие семь бит в этой таблице будут храниться в том же байте. Bigint (8 байт). 64-разрядное целое число, позволяет хранить числа от –263 до +263–1. Int (4 байта). Диапазон значений от –2 147 483 648 до +2 147 483 647. SmallInt (2 байта). Диапазон значений от –32768 до +32767. TinyInt (1 байт). Диапазон значений от 0 до 255. 2. Числа с фиксированной запятой: Decimal или Numeric. Диапазон значений от –1038–1 до +1038–1. Money (8 байт). Денежный формат, диапазон значений от –263 до +263 с четырьмя знаками после запятой. SmallMoney (4 байта). Денежный формат, диапазон значений от –214748,3648 до +214748,3647. 3. Числа с плавающей запятой: Float. Диапазон значений от –1,79E +308 до +1,79E +308. 4. Дата и время: DateTime (8 байт). Диапазон значений от 1 января 1753 года до 31 декабря 9999 года с точностью до трех сотых секунды. DateTime2 (6-8 байт). Новый тип данных, поддерживает точность до 0,1 мс. SmallDateTime (4 байта). Диапазон значений от 1 января 1900 года до 6 июня 2079 года с точностью одна минута. DateTimeOffset (8-10 байт). Аналогичен типу DateTime, но хранит ещё сдвиг относительно времени UTC5. 5 UTC (Universal Time Coordinated) – универсальное синхронизированное время. Date (3 байта). Хранит только дату. Диапазон значений от 1 января 0001 года до 31 декабря 9999 года. Time (3-5 байт). Хранит только время с точностью до 0,1 мс. 5. Символьные строки: Char. Строка фиксированной длины. Максимальная длина строки 8000 символов. VarChar. Строка переменной длины. Максимальная длина строки 8000, но при использовании ключевого слова «max» может хранить до 231 байт. Text. Применялся для хранения больших строк, сейчас рекомендуется использование varchar(max) вместо text. Оставлен для обратной совместимости. Nchar. Строка фиксированной длины в Юникоде. Максимальная длина строки 4000 символов. NvarChar. Строка переменной длины в Юникоде. Максимальная длина строки 4000 символов, но при использовании ключевого слова «max» может хранить до 231 байт. Ntext. Аналогичен типу text, но предназначен для работы с Юникод. Сейчас рекомендуется использовать nvarchar(max). Оставлен для обратной совместимости. 6. Двоичные данные: Binary. Позволяет хранить двоичные данные размером до 8000 байт. VarBinary. Тип данных переменной длины, позволяет хранить до 8000 байт, но при использовании ключевого слова «max» до 231 байт. Image. Использовался для хранения больших объемов данных, сейчас рекомендуется использовать varbinary(max). Оставлен для обратной совместимости. 7. Прочие типы данных: Table. Особый тип данных, используемый в основном для временного хранения таблиц и для передачи в качестве параметра в функции. HierarchyID. Используется для представления положения в иерархической структуре. Sql_variant. Тип данных, хранящий значения различных типов данных, поддерживаемых MS SQL Server. XML. Позволяет хранить XML-данные. Cursor (1 байт). Тип данных для переменных или выходных параметров хранимых процедур, которые содержат ссылку на курсор. Timestamp / rowversion (8 байт). Это тип данных, который представляет собой автоматически сформированные уникальные двоичные числа в базе данных. Значение данного типа генерируется БД автоматически при вставке или изменении записи. UniqueIdentifier (16 байт). Представляет собой GUID (Special Globally Unique Identifier). Гарантируется уникальность данного значения. Переменные в Transact-SQL Любой объект базы данных должен обладать уникальным именем внутри этой базы. На основе имени происходит обращение к этому объекту. Имена объектов называются идентификаторами. Transact-SQL накладывает ряд ограничений на порядок именования объектов: первый символ имени должен быть одним из символов латинского алфавита (A-Z, a-z), либо символом @, # или _, т.е. не допускается использование цифр и прочих специальных символов. Остальная часть имени может включать любые символы алфавита, цифры и некоторые специальные символы; общая длина имени обычного объекта не должна превышать 128 символов, для временных объектов – 116; внутри имени запрещается использование пробелов, скобок и таких символов, как ~, !, %, ^, & и др. имя объекта не должно совпадать с зарезервированным словом и с именем уже существующего объекта; если имя объекта содержит пробелы или совпадает с зарезервированным словом, то его необходимо поместить внутрь квадратных скобок [ ]. Замечание: Transact-SQL является CASE-нечувствительным языком, т.е. не различает регистра символов. Имена локальных переменных должны удовлетворять перечисленным правилам именования объектов и всегда должны начинаться с символа @. Область действия переменной ограничена пакетом операторов или процедурой, в которой она была объявлена. Объявление переменной Синтаксис команды (внутри квадратных скобок в описании синтаксиса располагаются необязательные элементы): DECLARE @ИмяПеременной ТипДанных [ ,…n] Пример объявления одной переменной: DECLARE @sum int Пример объявления нескольких переменных: DECLARE @temp int, @count float Присвоение значения Синтаксис команды: SET @ИмяПеременной = Выражение Пример присвоения значения: SET @sum = 0 В версии MS SQL Server 2008 появились следующие нововведения. Инициализировать переменную стало можно сразу при объявлении, например: DECLARE @iCounter int = 0 Появились операторы +=, –=, *=, /= для краткой формы записи арифметических конструкций. Управляющие конструкции Transact-SQL Группировка команд Группировка двух и более команд в единый блок осуществляется с помощью конструкции: BEGIN ... END Такая группировка используется в условных и циклических конструкциях. Конструкция ветвления Выполнение той или иной группы команд в зависимости от выполнения или не выполнения некоторого условия реализуется с помощью конструкции: IF <условие> Оператор [ELSE Оператор ] При отсутствии команд, выполняемых при несоблюдении условия, ключевое слово ELSE можно не указывать. Следует отметить особенность проверки значений на NULL (специальный маркер, обозначающий отсутствие информации). Вместо обычного сравнения: IF @myvar = NULL, следует использовать оператор IS: IF @myvar IS NULL. Конструкция CASE Аналогична оператору CASE в языках программирования. В MS SQL Server 2008 оператор CASE имеет два возможных варианта использования. 1. С входным выражением: CASE <входное выражение> WHEN <выражение when > THEN <результат> [...] [ELSE <результат>] END Пример: SELECT TOP 10 SalesOrderID, SalesOrderID % 10 AS ‘Last Digit’, Position = CASE SalesOrderID % 10 WHEN 1 THEN ‘Один’ WHEN 2 THEN ‘Два’ WHEN 3 THEN ‘Три’ WHEN 4 THEN ‘Четыре’ ELSE ‘Другое’ END FROM Sales.SalesOrderHeader; Результат запроса представлен на рис. 3.1. Рис. 3.1. Результат использования оператора CASE 2. Без входного выражения: CASE WHEN <логическое выражение> THEN <результат> [...] [ELSE <результат>] END Используется, как правило, для поиска. Пример: SELECT TOP 10 SalesOrderID % 10 AS 'OrderLastDigit', ProductID % 10 AS 'ProductLastDigit', "How Close?" = CASE WHEN (SalesOrderID % 10) < 3 THEN 'Меньше трёх' WHEN ProductID = 6 THEN 'ProductID равен 6' WHEN ABS(SalesOrderID % 10 - ProductID) <= 1 THEN ' В пределах одного' ELSE 'Больше одного' END FROM Sales.SalesOrderDetail ORDER BY SalesOrderID DESC; Результат выполнения запроса представлен на рис. 3.2. Рис. 3.2. Результат использования оператора CASE Циклическая конструкция Transact-SQL поддерживает единственный тип цикла – цикл WHILE, синтаксис которого следующий: WHILE условие Оператор [BREAK | CONTINUE] Замечание. Вертикальная черта в описании синтаксиса означает «или», т.е. в данном примере может быть указан либо BREAK, либо CONTINUE. Тело цикла выполняется до тех пор, пока условие истинно. Цикл можно принудительно остановить, если выполнить в теле цикла команду BREAK. Если же нужно начать цикл заново, не дожидаясь выполнения команд тела цикла, необходимо выполнить команду CONTINUE. Конструкция WAITFOR В некоторых случаях требуется отложить выполнение той или иной команды. Для этих целей можно воспользоваться оператором WAITFOR. Эта команда имеет следующий синтаксис: WAITFOR DELAY <’time’> | TIME <’time’> Если используется параметр DELAY, то указывается, сколько времени необходимо ждать MS SQL Server. Максимально возможная задержка – 24 часа. Пример использования: WAITFOR DELAY ‘01:00’, который приостановит выполнение на один час. Если используется параметр TIME, то исполнение будет приостановлено до наступления заданного времени. Пример использования: WAITFOR TIME ‘01:00’ – приостановление выполнения кода до наступления часа ночи. Блок TRY/CATCH Данную конструкцию можно использовать для обработки исключительных ситуаций. Впервые это конструкция появилась в MS SQL Server 2005. Блок TRY/CATCH в MS SQL Server работает также как и в других языках программирования. Используется следующий синтаксис: BEGIN TRY { <выражения SQL> } END TRY BEGIN CATCH { <выражения SQL> } END CATCH [ ; ] В блоке BEGIN TRY... END TRY выполняются потенциально опасные команды, если при этом произойдет ошибка уровня 11-19, то выполнение будет передано в блок CATCH. Уровни ошибок: 1–10 Информационные сообщения. Например, обнаружение NULL значений при выполнении агрегатных функций. Так как управление в блок CATCH данные ошибки не передают, то для получения информации об ошибки можно использовать функцию @@ERROR. 11–19 Относительно серьезные ошибки. Например, нарушение ограничений внешнего ключа. 20–25 Очень серьезные ошибки. Это ошибки на уровне системы, поэтому в коде нельзя узнать о ее возникновении. Такие ошибки разрывают текущее соединение и прерывают выполнение команд. Комментарии Существует два вида комментариев: однострочные – в этом случае игнорируется текст справа от символов комментария: -- (двойной дефис); многострочные – игнорируется текст, записанный между двумя парами символов: /* … */. Функции Transact-SQL MS SQL Server имеет ряд встроенных функций для облегчения и ускорения обработки данных. Различают три типа функций: функции наборов записей – результатом выполнения является объект, который может быть использован как таблица данных; агрегатные функции – результатом является единственное значение заданного атрибута из некоторого множества записей; скалярные функции – результатом также является одно значение из строго определенного набора аргументов. Скалярные функции Выделяют следующие категории скалярных функций – математические, строковые, для работы с датами, конфигурационные и системные. Рассмотрим каждую категорию. Математические функции Большинство математических функций возвращают результат того же типа, что и исходные значения. Например, при переводе величины угла из градусов в радианы в случае Radians(90) результат равен 1, что неверно, так как в качестве аргумента функции использовано целое число. Правильная запись: Radians (90.0). Abs (выражение) – вычисление абсолютного значения выражения. Можно использовать как целочисленные, так и нецелочисленные величины. IsNumeric (выражение) – проверка, имеет ли указанное выражение числовой тип данных. Результат равен 1, если выражение имеет числовой тип, иначе – 0. Rand () – возвращает случайное значение на основе системного времени в диапазоне от 0 до 1. Floor (выражение) – округление указанного значения до ближайшего минимального целого числа. Ceiling (выражение) – возвращает ближайшее целое число, большее или равное данному. Power (выражение, степень) – возведение в степень выражения. Тип возвращаемого значения совпадает с исходным типом. Sqrt (выражение) – вычисляет квадратный корень. Строковые функции Ascii (строка) – возвращает ASCII-код самого левого символа строки. Char (выражение) – возвращает символ, ASCII-код которого соответствует указанному числовому выражению. Len (строка) – вычисляет длину строки в символах. LTrim (строка), RTrim (строка) – удаляют начальные и концевые пробелы соответственно. Left (строка, число), Right (строка, число) – возвращают указанное количество символов строки, начиная с левого и правого края строки соответственно. SubString (строка, начало, длина) – возвращает для строки подстроку указанной длины, начиная с указанного символа. CharIndex (строка1, строка2 [, старт]) – поиск подстроки строка1 в строке строка2. Возвращает порядковый номер первого символа, с которого начинается первое вхождение подстроки в строку. Дополнительно можно указать стартовую позицию, с которой будет начат поиск. Stuff (строка1, начало, длина, строка2) – удаляет определенное количество символов строки1, начиная с указанного, и заменяет их новой строкой2. Replace (строка1, строка2, строка3) – заменяет все вхождения строки строка2 в исходной строке строка1 на строка3. Reverse (строка) – возвращает строку, символы которой записаны в обратном порядке по отношению к исходной строке. Функции для работы с датами GetDate () – возвращает текущее системное время. IsDate (выражение) – проверяет правильность выражения на соответствие одному из возможных форматов ввода даты. Day (дата), Month(дата), Year(дата) – возвращают день, месяц и год из указанной даты. DateName (тип, дата) – выделяет из даты указанную в типе часть и возвращает ее в символьном формате. Формат частей: yy или yyyy – год, qq или q – квартал, mm или m – месяц, dd или d – день, wk или ww – неделя, hh – час, mi или m – минута, ss или s – секунда, ms – миллисекунда. DatePart (тип, дата) – выделяет из даты указанную часть и возвращает ее в числовом формате. DateAdd (тип, число, дата) – добавляет к указанной дате число, тип которого указан в первом параметре. DateDiff (тип, начало, окончание) – возвращает разницу между указанными частями дат в указанном типе. Конфигурационные функции Возвращают информацию о текущей конфигурации MS SQL Server. Например: @@Version – возвращает информацию о дате, версии и типе процессора сервера. @@ServerName – символьное имя локального MS SQL Server. @@Max_Connections – максимально одновременных подключений к серверу. разрешенное количество Системные функции Возвращают информацию о значениях, объектах и текущих параметрах MS SQL Server. DataLength(выражение) – возвращает число, соответствующее количеству байт, необходимых для хранения результата выражения. @@Error – код последней ошибки, произошедшей в текущем соединении. Если ошибок нет, результат равен 0. Host_Name() – символьное имя компьютера в сети, на котором выполняется команда. System_User и Session_User – возвращают соответственно имя учетной записи пользователя для входа и имя пользователя текущей базы данных. @@IDLE – определяет количество миллисекунд, прошедшее со времени последнего запуска MS SQL Server. NewID() – генерирует новое значение типа UniqueIdentifier. Permission ([ObjectID[, ‘column’]]) – возвращает информацию о правах доступа для текущего пользователя. Аргумент ObjectID указывает идентификационный номер объекта базы данных. Для получения идентификационного номера объекта по его имени используется функция Object_ID(‘имя’). Результатом данной функции является 32-битное значение, каждый бит которого соответствует тому или иному праву доступа. Если значение этого бита равно 1, то доступ к объекту разрешен. Определим, например, имеет ли пользователь право выборки данных из таблицы Product БД AdventureWorks2008: SELECT Permissions (object_id('production.product')) Если первый младший бит результата равен 1, то выборка данных из таблицы Product разрешена. Чтобы проверить право доступа к полю некоторой таблицы, необходимо указать идентификационный номер этой таблицы данных и в аргументе ‘column’ указать имя этого поля. Например, для проверки возможности выборки данных из поля Stor_id таблицы Sales необходимо: SELECT Permissions (object_id('production.product'),'ProductID') Если первый младший бит результата равен 1, то выборка данных из поля ProductID таблицы Product также разрешена. Отладка кода в Management Studio В MS SQL Server 2008 появилась возможность отлаживать SQL-код при помощи пошагового выполнения. Для этого существуют команды Debug – Step Into (F11) и Debug – Step Over (F10). Команда Debug – Toggle Breakpoint (F9) устанавливает точку останову, до которой будет происходить выполнение кода. Во время отладки доступны такие окна: Locals – автоматически содержит список всех локальных переменных и показывает их текущие значения; Watch – позволяет вручную добавлять переменные для отслеживания их значений; Callstack – показывает стек вызовов функций. Снимок экрана во время процесса отладки показан на рис. 3.3. Рис. 3.3. Окно отладки в Management Studio. Желтая стрелка указывает на текущую исполняемую строку; красный кружок – точка останова. Краткие итоги. Рассмотрены типы данных, доступные в MS SQL Server 2008. Продемонстрировано использование базовых алгоритмических конструкций и локальных переменных, а также показана возможность отладки SQL-кода. Лекция № 4 Тема: Выборка данных Цель: сформировать представление о возможностях и способах использования оператора SELECT. Целью любой системы управления базами данных является осуществление операций над данными: ввод, изменение, удаление и выборка. При этом выборка данных является наиболее часто используемым аспектом управления данными. Выборка осуществляется с помощью одной единственной команды SELECT, являющейся частью языка DML6 (Data Manipulation Language – язык управления данными). Результатом выполнения данной команды является итоговый набор данных, состоящий из таких частей, как заголовки столбцов и записи данных. Этот набор должен содержать не менее одного столбца, записи могут быть, а могут и отсутствовать. Команда SELECT состоит из семи основных частей: списка выборки и разделов FROM, WHERE, GROUP BY, HAVING, ORDER BY и COMPUTE – обязательным является лишь список выборки, при использовании же остальных частей необходимо их использовать в том порядке, в котором они приведены выше. Простая выборка данных Для простой выборки данных используется сокращенный синтаксис оператора SELECT: SELECT [ALL | DISTINCT] [TOP n [PERCENT] СписокВыборки FROM ИмяТаблицы WHERE УсловиеОтбора СписокВыборки определяет поля, включаемые в итоговый набор данных, ИмяТаблицы указывает таблицу БД, из которой возвращаются записи, а УсловиеОтбора позволяется ограничить число возвращаемых записей с помощью логических операторов. По умолчанию команда SELECT возвращает все записи, включая дубликаты, что определяется ключевым словом ALL, которое может быть опущено. Для получения набора уникальных неповторяющихся записей необходимо указывать ключевое слово DISTINCT. Использование ключевого слова TOP предписывает выводить не все записи итогового набора, а только n первых. Можно выбирать не фиксированное количество записей, а определенный процент от всех строк – для этого указывается ключевое слово PERCENT. 6 DML – это семейство компьютерных языков, используемых в компьютерных программах или пользователями баз данных для получения, вставки, удаления или изменения данных в базах данных. SQL является самым известным и используемым представителем языков данного семейства. Список выборки Список выборки может содержать включать следующие один или несколько элементов: * | ИмяПоля | Выражение [AS Псевдоним], [...n]. Для выборки всех полей из таблицы в списке выборки необходимо указать звездочку (*). Ключевое слово AS позволяет заменить в итоговом наборе данных обычные имена полей псевдонимами. Имя псевдонима должно удовлетворять стандартным правилам именования объектов. При необходимости включить недопустимые символы, пробелы или национальные алфавиты, имя псевдонима заключается в квадратные скобки. Например, для получения списка стран с указанием их кода и последней даты изменения записи из таблицы CountryRegion базы данных AdventureWorks2008 необходимо выбрать поля CountryRegionCode, Name, ModifiedDate: SELECT CountryRegionCode AS 'Код', [Name] AS 'Страна', ModifiedDate AS 'Дата изменения' FROM Person.CountryRegion При этом БД AdventureWorks должна быть текущей. Обратите внимание, что перед названием таблицы используется еще название схемы Person, предназначенной для управления объектами, связанными с работниками и департаментами. Поля данных будут представлены пользователю в порядке, определенном в списке выборки. Элемент Выражение задает выражение, которое включается в итоговый набор данных. Выражение может содержать константы, имена полей, функции и их комбинации. По умолчанию имя колонки с выражением не определено, поэтому можно указать псевдоним. Например, список сотрудников с указанием фамилии и первого символа имени и идентификационного номера может быть получен в результате запроса: SELECT LastName+’ ‘+Substring(FirstName,1,1)+’.’ AS [Сотрудник], ContactID FROM Person.Contact Удобочитаемость получаемого набора данных может быть повышена путем его сортировки в возрастающем или убывающем порядке. Сортировка возможна по имени поля (даже если оно и не указано в списке выборки), по псевдониму или по позиции в списке выборки, которые указываются в разделе ORDER BY ИмяПоля [,…n] [ASC | DESC]. По умолчанию сортировка осуществляется по возрастанию, что соответствует зарезервированному слову ASC, которое может опускаться, для сортировки в убывающем порядке указывается – DESC. Для отображения, рассмотренного ранее, списка сотрудников упорядоченного в алфавитном порядке необходимо дополнить запрос: SELECT LastName+’ ‘+Substring(FirstName,1,1)+’.’ AS [Сотрудник], ContactID FROM Person.Contact ORDER BY [Сотрудник] Условие отбора Условие отбора определяет критерий отбора записей, включаемых в итоговый набор. В результат будут включены только те строки, которые соответствуют наложенным условиям. Условие может включать выражения, образованные с помощью операторов сравнения или логических операторов. Условия могут также объединяться и с помощью логических операндов AND, OR и NOT. Например, чтобы получить список товаров, цена которых находится в диапазоне от $12 до $20, необходимо выполнить следующий запрос: SELECT [Name], ListPrice FROM Production.Product WHERE (ListPrice>=12) and (ListPrice<=20) ORDER by 2 Эти два оператора сравнения могут быть заменены одним логическим оператором BETWEEN, с помощью которого можно получить ответ на вопрос, лежит ли величина в указанном диапазоне. SELECT [Name], ListPrice FROM Production.Product WHERE ListPrice BETWEEN 12 and 20 ORDER BY ListPrice Данный оператор предназначен лишь для того, чтобы облегчить логику восприятия алгоритма. Для поиска по шаблону символьных строк используется логический оператор LIKE, который чаще всего используется в ситуациях, когда неизвестно точное совпадение. В шаблоне могут использоваться следующие универсальные символы: % – подразумевает любую строку, состоящую из 0 и более символов; _ – ровно один символ; [ ] – любой символ из заданного множества (например, [adfh]) или диапазона (например, [0-9]), [^] – любой символ, не попадающий в заданный диапазон или множество. Например, чтобы вывести имена сотрудников и их должностей, проживающих за пределами США, необходимо выполнить запрос: SELECT LastName, JobTitle FROM HumanResources.vEmployee WHERE CountryRegionName Not LIKE ‘%United States%’ Для определения соответствия выражения одному из перечисленных в заданном списке значений применяется логический оператор IN. Данный оператор всегда может быть записан и в виде группы условий, объединенных операндом OR. Например, с помощью следующего запроса может быть получен список сотрудников из США и Канады: SELECT LastName, JobTitle FROM HumanResources.vEmployee WHERE CountryRegionName IN (‘United States’, ‘Canada’) Однако в список значений нельзя включать неопределенное значение NULL, для работы с такими значениями используется функция выборки IS NULL. Например, следующий запрос возвращает список товаров, у которых не указан цвет: SELECT [Name] FROM Production.Product WHERE Color IS NULL Выборка данных из нескольких таблиц Такая выборка данных предполагает соединение нескольких таблиц для получения единого набора результатов, включающих записи и поля каждой таблицы. Соединение позволяет собрать данные, разделенные в процессе нормализации. Существует три вида соединений: внутреннее, внешнее и перекрестное. Для объединения трех и более таблиц можно применять последовательность соединений. Для соединения таблиц необходимо раздел FROM дополнить ключевыми словами JOIN, которое определяет соединяемые таблицы и метод соединения, и ON, указывающее общие для таблиц поля. Внутреннее соединение При таком виде соединения сравниваются значения общих полей двух таблиц, возвращаются только записи, удовлетворяющие критерию связывания в обеих таблицах. Записи, для которых не имеется пары в связанной таблице, в результат не включаются. Например, в таблице Product нормализованной базы данных AdventureWorks храниться только идентификатор категории товара. Чтобы получить список товаров с указанием их категорий, необходимо соединить таблицы Product и ProductSubcategory: SELECT Product.Name, ProductSubcategory.Name, Product.ListPrice FROM Production.Product INNER JOIN Production.ProductSubcategory ON Product.ProductSubcategoryID = ProductSubcategory.ProductSubcategoryID При таком соединении товары, для которых не указана их категория, не включаются в набор результатов. Обратите внимание, что в разделе FROM необходимо указать имя схемы Production, а в остальных случаях перед указанием поля используется имя таблицы Product и ProductSubcategory для разрешения конфликтов, т.к. в обеих таблицах присутствуют поля Name. Внешнее соединение Такое соединение также возвращает объединенные записи, соответствующие условию объединения. Однако левые и правые соединения возвращают записи и не соответствующие указанному условию объединения. Такие соединения применяются для получения полного набора записей одной из таблиц. При левом соединении в результат будут включены все записи левой таблицы (имя которой расположено слева от JOIN), независимо от того, есть для них соответствующая запись в правой таблице (имя таблицы расположено справа от JOIN) или нет. Например, следующий запрос возвращает имя контактного лица и дату размещения заказа: SELECT FirstName, LastName, OrderDate FROM Person.Contact LEFT JOIN Sales.SalesOrderHeader ON Contact.ContactID = SalesOrderHeader.ContactID Для лиц, не размещавших заказы, в поле OrderDate содержится значение NULL. При правом соединении (ключевое слово RIGHT JOIN) в результат включаются все записи правой таблицы, независимо от того, есть для них соответствующая строка в левой таблице. Измените рассмотренный запрос так, чтобы он выдавал такие же результаты при использовании правого соединения. Перекрестные соединения При таком соединении выводятся все комбинации записей таблиц, при этом не требуется указание совпадающих значений полей, поэтому условие ON опускается. В нормализованных базах данных перекрестные соединения чаще всего используются для получения списка всех возможных комбинаций записей двух таблиц, т.е. число записей итогового набора равняется произведения числа записей первой таблицы на число записей второй. Например, с помощью перекрестного соединения можно перечислить все возможные способы поставки товаров в базе данных Northwind (поставлялась с MS SQL Server до появления AdventureWorks): SELECT DISTINCT Suppliers.Country, Orders.ShipCountry FROM Suppliers CROSS JOIN Orders Объединение нескольких наборов результатов Оператор UNION объединяет результаты двух и более операторов SELECT и применяется в случае, когда данные нельзя получить при помощи одного запроса. Для получения единого итогового набора данных необходимо написать отдельные операторы SELECT и объединить их при помощи оператора UNION, при этом, в отличие от соединения, записи в итоговый набор добавляются друг за другом: SELECT ... UNION [ALL] SELECT ... [,...] По умолчанию повторяющиеся записи удаляются, для получения всех записей необходимо указать ключевое слово ALL. Необходимо также учитывать, что список полей, порядок и все их свойства должны быть одинаковы во всех используемых запросах. Имена полей итогового набора берутся из первого запроса, поэтому создание псевдонимов полей выполняется в нем. Для получения отсортированного набора данных раздел ORDER BY указывается после последнего оператора SELECT. Аналитическая выборка данных Аналитическая выборка данных из базы данных опирается на возможности Transact-SQL создавать запросы, неразрывно связанных с агрегатными функциями: Avg ([all | distinct] выражение) – среднее арифметическое всех значений. Count ([all | distinct] выражение | *) – количество значений в списке, отличных от NULL. При использовании символа * подсчитывается количество значений, включая значения NULL или повторяющиеся значения. Sum ([all | distinct] выражение) – сумма всех значений списка. Max ([all | distinct] выражение) –максимальное значение. Min ([all | distinct] выражение) – минимальное значение. Ключевое слово all предписывает выполнять агрегирование всех записей в результирующем наборе данных, distinct – агрегирование только уникальных записей. По умолчанию используется all. Например, вычисление средней цены товаров осуществляется с помощью следующего запроса: SELECT AVG(ListPrice) FROM Production.Product При выполнении агрегатной функции осуществляется объединение значений отдельного поля таблицы или части записей, после чего выполняется указанное агрегирование. Агрегатная функция возвращает одно единственное значение, поэтому использование других имен полей в списке выборки запрещено. Подзапросы Подзапрос – это оператор SELECT, включенный в другие запросы. Подзапросы применяются для разбивки сложного запроса на серию логических этапов. Их применение эффективно, если запрос использует записи, возвращенные другим запросом. Существует два вида подзапросов. 1) Вложенные подзапросы – возвращают единственное значение либо список значений. Вложенный запрос выполняется один раз, а затем результирующее значение используется во внешнем запросе. Например, чтобы определить имена заказчиков, разместивших заказы в последний учетный день, можно воспользоваться следующим запросом: SELECT CustomerID FROM Sales.SalesOrderHeader WHERE OrderDate = (SELECT Max(OrderDate) FROM Sales. SalesOrderHeader) Выполнение этого запроса осуществляется в два этапа: на первом – осуществляется выполнение подзапроса, как самостоятельного запроса, который возвращает значение, используемое на втором этапе при выполнении внешнего запроса. В результате получаем имена и фамилии, которые могут быть использованы в подзапросе для получения полного имени заказчика: SELECT FirstName + ' ' + LastName AS 'CustomerName' FROM Sales.vIndividualCustomer WHERE CustomerID in (SELECT CustomerID FROM Sales.SalesOrderHeader WHERE OrderDate= (SELECT Max(OrderDate) FROM Sales. SalesOrderHeader)) Такой запрос может быть оформлен и в виде соединения таблиц. Такие запросы обрабатываются значительно быстрее, поэтому если выполнение запроса не требуется выполнять в несколько этапов, использование подзапросов не обязательно. 2) Связанные подзапросы – используются данные внешнего запроса, причем связанный запрос выполняется один раз для каждой записи внешнего запроса. Например, для определения списка заказчиков, заказавших за один раз более 300 единиц товара, необходимо выполнить следующий запрос: SELECT SalesOrderID, CustomerID FROM Sales.SalesOrderHeader oh WHERE 300 < (SELECT sum(OrderQty) FROM Sales.SalesOrderDetail od WHERE od.SalesOrderID = oh.SalesOrderID) В связанных подзапросах, чтобы различать имена таблиц необходимо применять их псевдонимы. В примере для таблицы SalesOrderHeader определен псевдоним oh, а для SalesOrderDetail – od. Однако использование связанных подзапросов неэффективно, лучше преобразовывать их в соединения таблиц, что позволяет оптимизатору запросов выбирать наилучший способ обработки данных. Например, следующий запрос для каждого товара отображает сведения о самом крупном его заказе: количество заказанного товара и номер заказа. SELECT Name, OrderQty, SalesOrderID FROM Production.Product p INNER JOIN Sales.SalesOrderDetail od1 ON od1.ProductID=p.ProductID WHERE OrderQty = (SELECT Max(OrderQty) FROM Sales.SalesOrderDetail od2 WHERE od1.ProductID = od2.ProductID) Группировка записей Для группировки записей по полям или выражениям применяется раздел GROUP BY оператора SELECT, что позволяет применять для каждой группы функции агрегирования. Синтаксис данной части следующий: [GROUP BY ВыражениеГруппировки, [...n]] Например, чтобы определить количество товаров в каждом заказе, необходимо сгруппировать записи с одинаковым идентификационным номером заказа SalesOrderID и подсчитать количество записей в каждой группе: SELECT SalesOrderID, count(ProductID) AS [Количество] FROM Sales.SalesOrderDetail GROUP BY SalesOrderID При использовании GROUP BY для каждой определенной группы значений выводится только одна запись в итоговом наборе данных. Если для каждого заказа еще необходимо подсчитать и общее количество товаров в заказе, то запрос должен быть дополнен: SELECT SalesOrderID, count(ProductID) AS [Количество], sum(OrderQty) AS [Сумма Товаров] FROM Sales.SalesOrderDetail GROUP BY SalesOrderID При группировке записей допускается также использование раздела WHERE, в этом случае группируются записи, удовлетворяющие этому условию. Раздел WHERE позволяет определить, какие записи должны подвергнуться группировке, а раздел HAVING – какие группы должны быть выведены в итоговый набор данных. Ключевое слово HAVING можно использовать только в разделе GROUP BY. Так с помощью этого раздела можно в итоговый набор данных поместить только те заказы, сумма товаров в которых превышает 150 единиц: SELECT SalesOrderID, count(ProductID) AS [Количество], sum(OrderQty) AS [Сумма Товаров] FROM Sales.SalesOrderDetail GROUP BY SalesOrderID HAVING sum(OrderQty) >= 150 Краткие итоги. Были рассмотрены основные варианты использования оператора SELECT, возможность и необходимость соединения таблиц (внутреннее, внешнее, перекрестное). Кроме того были изучены агрегатные функции MS SQL Server и способы их применения в операторе SELECT. Лекция № 5 Тема: Вспомогательные объекты базы данных Цель: сформировать понятие о назначении хранимых процедур и представлений. Понятие хранимой процедуры Хранимая процедура (Stored procedure) – это именованный набор операторов Transact-SQL, хранящийся на сервере. Организация взаимодействия между клиентом и сервером с помощью хранимых процедур предполагает следующее: клиент по известному имени вызывает блок команд, хранящийся на сервере базы данных, сервер выполняет этот блок команд и возвращает клиенту результат. Таким образом, использование хранимых процедур снижает сетевой трафик и сокращает число запросов клиентов, т.к. вместо пересылки по сети нескольких операторов передается лишь имя вызываемой процедуры. Хранимые процедуры являются самостоятельными объектами базы данных, к которым можно разрешать или запрещать доступ командами GRANT и DENY. Например, выполнение следующей команды запретит выполнение команд хранимой процедуры hello для пользователя mng: DENY exec ON hello TO mng. Хранимые процедуры схожи с процедурами других языков программирования и позволяют: включать различные операторы и вызывать другие хранимые процедуры; принимать входные параметры и возвращать значения в виде выходных параметров. MS SQL Server поддерживает следующие виды хранимых процедур: системные процедуры – хранятся в системной базе данных master, их имена начинаются с символов sp_. Используются для решения специализированных системных задач: администрирования, безопасности и др.; пользовательские процедуры – создаются, хранятся и выполняются пользователями в контексте только той базы данных, для которой были созданы; временные процедуры – доступны только в активном соединении, после закрытия соединения удаляются автоматически. Имена таких процедур должны начинаться с символа #. Для работы с хранимыми процедурами предназначены системные хранимые процедуры: sp_helptext ИмяПроцедуры – выводит код указанной хранимой процедуры; sp_help ИмяПроцедуры – выводит список параметров и их типов данных для указанной процедуры; sp_stored_procedures – возвращает список сохраненных процедур текущей базы данных. Как и большинство объектов MS SQL Server хранимая процедура может быть создана с помощью средств Transact-SQL или с применением графического интерфейса Management Studio. При создании хранимой процедуры необходимо учитывать следующие особенности: процедура может содержать неограниченно количество операторов, кроме операторов создания следующих объектов: процедуры, представления, правила, умолчания; создание процедуры может выполнить пользователь роли sysadmin, db_owner или db_ddladmin, а также имеющий право на выполнение команды CREATE PROC; количество параметров не должно превышать 2100. Создание процедуры средствами Transact-SQL Создание хранимой процедуры заключается в выполнении следующей команды: CREATE PROCEDURE|PROC <sproc name> [<parameter name> [<schema>.]<data type> [VARYING] [= <default value>] [OUT[PUT]] [READONLY] [, n...] [WITH RECOMPILE| ENCRYPTION | [EXECUTE AS { CALLER|SELF|OWNER|’<user name>’}] [FOR REPLICATION] AS <code> | EXTERNAL NAME <assembly name>.<assembly class>.<method> Имя процедуры должно удовлетворять правилам именования объектов MS SQL Server; parameter name определяет имя параметра (должно начинаться с символа @), который будет использоваться для передачи входных или выходных данных (при указании ключевого слова OUTPUT); data type указывает, к какому типу данных должны относиться значения параметра; default value – позволяет определить значение по умолчанию, если при вызове процедуры параметр был не указан; опция READONLY создает параметр доступный только для чтения, если параметр имеет тип table, то указание READONLY обязательно; режим WITH ENCRYPTION запрещает дальнейший просмотр кода создаваемой хранимой процедуры, шифруя его; режим RECOMPILE указывает, что сервер не кэширует план исполнения процедуры, и процедура компилируется только во время выполнения. После ключевого слова AS следуют или команды Transact-SQL, которые и составляют тело процедуры, или прописывается метод из указанной сборки .Net Framework. Пример создания хранимой процедуры с шифрованием: CREATE PROCEDURE HumanResources.uspEncryptThis WITH ENCRYPTION AS SELECT BusinessEntityID, JobTitle, NationalIDNumber, VacationHours, SickLeaveHours FROM HumanResources.Employee; Чтобы убедиться, что исходный текст процедуры недоступен, можно выполнить следующий код: EXEC sp_helptext 'HumanResources.uspEncryptThis'; Результатом выполнения будет сообщение: The text for object 'HumanResources.uspEncryptThis' is encrypted (Текст объекта 'HumanResources.uspEncryptThis' зашифрован). Выполнение процедуры Хранимая процедура может быть выполнена с помощью оператора EXECUTE: EXEC[UTE] [@СтатусВозврата =] ИмяПроцедуры [ [@параметр=] {Значение | Выражение} [OUTPUT] ] [,...] При использовании выходного параметра, его необходимо описать с использование ключевого слова OUTPUT при создании процедуры, а также использовать это слово и при указании соответствующего параметра при вызове процедуры. В противном случае процедура не передает выходное значение. Параметр @СтатусВозврата используется для получения значения кода возврата из хранимой процедуры, выполненного с помощью оператора RETURN Статус. Пользователю рекомендовано использовать положительные значения статуса. Управление хранимыми процедурами Изменение Для изменения существующей процедуры используется оператор ALTER PROC, параметры этой команды аналогичны параметрам команды создания процедуры. Переименование Для этого необходимо хранимую процедуру: использовать специальную системную sp_rename ‘ИмяОбъекта’ ‘НовоеИмяОбъекта’. Удаление Для удаления Transact-SQL: хранимой процедуры используется команда DROP PROC ИмяПроцедуры. Представления Представление (View) является еще одним объектом, составляющим логическую структуру любой базы данных. Представление для конечных пользователей выглядит как таблица, однако при этом не содержит данных, а лишь представляет их. Физически же представляемые данные расположены в различных таблицах базы данных. Представление реализуется в виде сохраненного запроса, на основе которого и производится выборка из различных таблиц базы данных. Представления обладают следующими преимуществами: обеспечивают конфиденциальность информации, т.к. позволяют отобразить только необходимую информацию, скрывая определенные поля; упрощают представление данных, т.к. пользователь работает с представлением как с единой таблицей, которая создана на основе выборки данных из нескольких таблиц; управляют правами доступа к данным, например, вместо того чтобы предоставлять права на выполнение запросов к определенным полям таблиц, проще разрешить выполнение запросов через представление. MS SQL Server предоставляет различные способы создания представлений: с помощью средств Transact-SQL и в утилите администрирования Management Studio. Создание представлений с помощью Transact-SQL Для создания представления используется команда CREATE VIEW, правом ее выполнения обладают члены ролей sysadmin, db_owner, db_dlladmin: CREATE VIEW ИмяПредставления [(поле [,...n])] [WITH ENCRYPTION] AS ЗапросВыборки При указании ИмяПредставления необходимо придерживаться ранее определенных правил именования объектов, также это имя не должно совпадать с именем уже существующей таблицы в базе данных. Параметр WITH ENCRYPTION определяет шифрование кода запроса и гарантирует, что пользователи не смогут просмотреть и использовать его. ЗапросВыборки представляет собой оператор SELECT, параметры которого и определяют содержимое представления. Имена полей представления задаются либо с помощью псевдонимов в операторе выборки, либо указываются в параметре поле. Например, создадим представление, содержащее лишь такую информацию о сотрудниках компании AdventureWorks, как: должность и логин сотрудника, дата рождения. CREATE VIEW InfoEmployees ([Номер], [Фамилия], [Дата рождения]) AS SELECT BusinessEntityID, JobTitle + '(' + LoginID + ')', CONVERT (char(10), BirthDate, 104) FROM HumanResources.Employee Для просмотра содержимого проекции выполняется следующий запрос: SELECT * FROM InfoEmployees С помощью данного представления ограничен доступ к некоторым полям исходной таблицы Employee, в этом случае говорят, что на таблицу наложен вертикальный фильтр, т.е. ограничен доступ к части полей таблицы без защиты на уровне столбцов. Если в коде запроса выборки определено условие отбора записей, то говорят, что на таблицу наложен горизонтальный фильтр. Например, следующее представление обеспечивает доступ к информации о производителях, имеющих онлайн-службы для заказа товара: CREATE VIEW OnlineVendors AS SELECT [Name] FROM Purchasing.Vendor WHERE PurchasingWebServiceURL IS NOT NULL В запросе выборки может быть указана команда SELECT любой сложности, однако при этом запрещается использовать раздела ORDER BY, который в дальнейшем можно применить при выборке данных из созданного представления. Также рекомендуется создавать представления только на основе таблиц, для которых выполнено внутреннее соединение. Например, создадим представление, отображающее стоимость каждого заказа с указанием заказчика и его номера: суммарную CREATE VIEW InfoOrders AS SELECT FirstName + ' ' + LastName as [Название компании], SalesOrderHeader.SalesOrderID as [Номер заказа], Convert (money, sum(UnitPrice*OrderQty*(1UnitPriceDiscount)),0) as [Итог] FROM (Person.Contact INNER JOIN Sales.SalesOrderHeader ON Contact.ContactID=SalesOrderHeader.ContactID) INNER JOIN Sales.SalesOrderDetail ON SalesOrderHeader.SalesOrderID=SalesOrderDetail.SalesOrderID GROUP BY SalesOrderHeader.SalesOrderID, FirstName + ' ' + LastName Следует помнить, что использование представлений не способствует производительности. Обращение к представлению вызывает выполнение его внутреннего кода, таким образом, в лучшем случае представления НЕ снизят производительность БД. Управление представлениями Созданное представление может быть изменено выполнением команды ALTER VIEW, имеющей аналогичный синтаксис команде CREATE VIEW. Для удаления представления необходимо выполнить команду: DROP VIEW ИмяПредставления Для получения информации о представлении используется хранимая процедура: sp_help ИмяПредставления, которая отображает список полей представления с описанием их свойств. Для отображения кода, с помощью которого создано представление, можно воспользоваться хранимой процедурой: sp_helptext ИмяПредставления. Список объектов, от которых зависит представление, может быть получен выполнением хранимой процедуры: sp_depends ИмяПредставления. Краткие итоги. Рассмотрены хранимые процедуры и представления, а также основные команды SQL для создания, использования и управления этими объектами. Лекция № 6 Тема: Система безопасности в базах данных Цель: показать способы защиты информации в MS SQL Server 2008. Любая система хранения информации должна быть максимально защищена как от случайного, так и от намеренного повреждения или искажения информации, т.е. при планировании базы данных необходимо четко определять полномочия каждого пользователя системы. В MS SQL Server предусмотрено три уровня безопасности: 1. аутентификация при регистрации; 2. разрешение на доступ к базе данных, поддерживаемой сервером; 3. полномочия (разрешения) пользователя. Аутентификация пользователя Безопасность во всех приложениях прежде всего основана на использовании имени пользователя (login) и пароля. При установке MS SQL Server создается учетная запись sa (system administrator – системный администратор), до MS SQL Server 2000 она создавалась с пустым паролем, в MS SQL Server 2008 использовать пустой пароль для sa по умолчанию запрещено и при установке сервера требуется задать сложный пароль в соответствии с текущими политиками безопасности Windows. Рассмотрим элементарные правила безопасности, которые на практике часто игнорируются. Одно имя (login) на одного пользователя. Несмотря на всю простоту требования, нередко несколько пользователей используют одно и то же имя для входа. Особенно это плохо в ситуации, когда данной учетной записи предоставлены привилегии администратора. Рекомендуется каждому пользователю создать отдельную учетную запись с минимально необходимым набором прав. Такой подход не только способствует повышению безопасности, но и позволяет производить аудит действий пользователей. Установка срока действия пароля (Password expiration). Ограничение по времени действия пароля может обезопасить в случае, если вы кому-то дали свой пароль для выполнения какой-то временной работы. По истечении срока действия пароля, доступ второго пользователя будет закрыт автоматически, если вы не сообщите ему новый пароль. Однако данная политика может иметь больше негативных последствий, чем положительных. Представьте ситуацию, когда пользователи вынуждены менять пароли каждые 30 дней: очень быстро пользователям надоест придумывать новые пароли и запоминать их, вследствие этого пароли будут составляться максимально простыми. Ограничение на минимальную длину пароля и его сложность (Password Length). Кроме длины пароли рекомендуется задавать требование на использование в пароле и букв и цифр, что значительно усложняет возможность подбора паролей. Также рекомендуется не использовать простые слова (имена, названия, торговые марки) и наборы чисел такие, как телефонные номера, номер паспорта, день рождения и т.д. Ограничение на количество попыток входа (Number of Tries to Log In). Главная задача этого правила – предотвратить подбор паролей хакерами. Поэтому любое небольшое значение, например, 3-5 попыток входа, вполне допустимо. Для реализации этих правил на практике необходимо рассмотреть, что представляет собой процесс аутентификации в MS SQL Server 2008 и какие типы аутентификации он поддерживает. Аутентификация пользователя – это процесс, при котором пользователь в зависимости от указанного имени пользователя и пароля допускается или нет к установлению соединения с MS SQL Server. MS SQL Server может работать в двух режимах аутентификации пользователей, используя либо режим аутентификации Windows (Windows Authentication), либо режим аутентификации средствами MS SQL Server (SQL Server Authentication). Эти режимы аутентификации используют различные учетные записи пользователей. При аутентификации средствами MS SQL Server учетную запись и пароль создает администратор баз данных MS SQL Server, при аутентификации средствами Windows – системный администратор сети (в этом случае для подключения к MS SQL Server пользователю не нужна учетная запись MS SQL Server). Аутентификация MS SQL Server позволяет определить имя пользователя для входа (login) и пароль для установления соединения с сервером. При установке MS SQL Server создается лишь одна учетная запись пользователя для входа – sa. Замечание. Учетная запись sa предназначена для выполнения всех функций администрирования сервера и имеет все права на доступ ко всем объектам всех баз данных сервера. С помощью хранимых процедур существует возможность добавления других учетных записей для организации работы с MS SQL Server, а также возможность управления списком прав пользователя, т.е. набором разрешенных ему действий. Роли сервера Другим фундаментом системы безопасности сервера являются роли. Под ролью понимаются определенные права на выполнение операторов и работу с объектами базы данных. Роли объединяют нескольких пользователей в группу, наделенную определенными правами, причем одному пользователю может быть назначено несколько ролей. Существует 8 постоянных ролей сервера, которые предоставляют административные привилегии на уровне сервера, вне зависимости от базы данных: sysadmin – может выполнять любые действия на MS SQL Server. По умолчанию сюда входит учетная запись sa и все члены группы администраторов Windows; setupadmin – управляет связанными серверами (linked servers) и процедурами, которые выполняются вместе с запуском сервера; securityadmin – может создавать и управлять логинами, читать журнал ошибок и создавать БД; processadmin – обладает правами управления процессами внутри MS SQL Server, например, член этой роли может завершать задачи, которые выполняются слишком долго; dbcreator – разрешено создание и изменение баз данных; diskadmin – управляет файлами баз данных: назначает файлы в группы, присоединяет/отсоединяет базы данных и т.д.; bulkadmin – позволяет выполнять команду BULK INSERT для вставки сразу большого количества записей в таблицу; Для просмотра информации о встроенных ролях используются хранимые процедуры: sp_helpsrvrole – возвращает список ролей сервера и описание каждой роли; sp_helpsrvrolemember [‘имя роли’] – возвращает список ролей и учетных записей, которым присвоены эти роли; sp_srvrolepermission [‘имя роли’] – возвращает список разрешений, присвоенных этим ролям. Замечание. Если указан необязательный параметр [‘имя роли’], то выводится информация, относящаяся только к указанной роли. На рис. 6.1. показан пример вызова хранимой процедуры. Рис. 6.1. Пример вызова хранимой процедуры Управление учетными записями для входа 1. Для добавления учетных записей пользователей для входа в MS SQL Server используется хранимая процедура sp_addlogin: sp_addlogin [@loginame=] ‘учетная запись пользователя для входа’ [, [@passwd=] ‘пароль пользователя’] [, [@defdb=] ‘база данных’] sp_addlogin [ @loginame = ] 'login' [ , [ @passwd = ] 'password' ] [ , [ @defdb = ] 'database' ] [ , [ @deflanguage = ] 'language' ] [ , [ @sid = ] sid ] [ , [ @encryptopt= ] 'encryption_option' ] @defdb – база данных, к которой будет подключать MS SQL Server этого пользователя по умолчанию. Если этот параметр не определен, то будет использоваться системная база данных master. @deflanguage – язык по умолчанию; если параметр не указан, то будет использоваться язык по умолчанию, заданный для сервера. @sid – идентификационный номер (security identification number); если параметр не задан, то sid будет сгенерирован. @encryptopt – указывает, нужно ли производить хэширование пароля, или вместо пароля уже используется хэш. Эта хранимая процедура широко используется на сегодняшний день. Однако в последующих версиях MS SQL Server она будет удалена. Вместо неё рекомендуется использовать следующую конструкцию: CREATE LOGIN loginName { WITH <option_list1> | FROM <sources> } <option_list1> ::= PASSWORD = { 'password' | hashed_password HASHED } [ MUST_CHANGE ] [ , <option_list2> [ ,... ] ] <option_list2> ::= SID = sid | DEFAULT_DATABASE = database | DEFAULT_LANGUAGE = language | CHECK_EXPIRATION = { ON | OFF} | CHECK_POLICY = { ON | OFF} | CREDENTIAL = credential_name <sources> ::= WINDOWS [ WITH <windows_options> [ ,... ] ] | CERTIFICATE certname | ASYMMETRIC KEY asym_key_name <windows_options> ::= DEFAULT_DATABASE = database | DEFAULT_LANGUAGE = language Параметры WITH позволяет задать пароль и настройки безопасности, а раздел FROM указывает, что логин не просто принадлежит MS SQL Server, а ассоциируется либо с учетной записью Windows, либо с сертификатом, либо с ключом. MS SQL Server накладывает ряд ограничений на имена пользователей, роли и пароли: имена пользователей, роли и пароли должны иметь размер от 1 до 128 символов и не содержать обратных слешей (\); имена пользователей не должны совпадать с ключевыми словами и встроенными именами пользователей; пароль может не содержать никаких символов, но в случае если активированы политики паролей, то он должен удовлетворять их требованиям. 2. Для просмотра информации по именам пользователей, использующимся для входа, используется хранимая процедура sp_helplogins. Пример выполнения этой процедуры показан на рис. 6.2. Рис. 6.2. Получение списка пользователей MS SQL Server 3. Изменение пароля учетной записи пользователя для входа выполняется с помощью процедуры sp_password. Замечание. Для получения справки по командам Transact-SQL и хранимым процедурам можно воспользоваться утилитой Management Studio. Для этого необходимо выделить имя оператора и нажать клавишу F1. Эта хранимая процедура широко используется на сегодняшний день. Однако в последующих версиях MS SQL Server она будет удалена. Вместо неё рекомендуется использовать конструкцию ALTER LOGIN. 4. Удаление учетной записи осуществляет хранимая процедура: sp_droplogin ‘учетная запись пользователя для входа’. Эта хранимая процедура широко используется на сегодняшний день. Однако в последующих версиях MS SQL Server она будет удалена. Вместо неё рекомендуется использовать следующую конструкцию: DROP LOGIN ‘учетная запись пользователя для входа’ 5. Для присвоения учетной записи для входа встроенной серверной роли используется процедура: sp_addsrvrolemember [@loginame=] ‘учетная запись пользователя для входа’ , [@rolename=] ‘роль’ Например: EXEC sp_addsrvrolemember 'Corporate\HelenS', 'sysadmin' 6. Отмена присвоения учетной записи определенной роли выполняется с помощью хранимой процедуры: sp_dropsrvrolemember [@loginame=] ‘учетная запись пользователя’, [@rolename=] ‘роль’ Например: EXEC sp_dropsrvrolemember 'JackO', 'sysadmin' Доступ к базе данных База данных – это важнейшая единица в системе безопасности MS SQL Server. Доступ к базе данных предоставляется пользователю базы данных (не путать с именем входа в MS SQL Server), наделенному определенными правами, которые определяются принадлежностью пользователя к роли базы данных. Роли базы данных Роли баз данных предоставляют наборы административных привилегий на уровне базы данных. При использовании ролей базы данных каждая учетная запись сервера будет иметь разные полномочия в зависимости от того, с какой базой данных осуществляется работа. Существует 10 встроенных ролей базы данных: db_owner – включает в себя права все других ролей базы данных. Пользователь получает права владельца базы. db_accessadmin – похожа на серверную роль securityadmin, за исключением того, что ограничена одной базой данных. Она не позволяет создавать новые логины MS SQL Server, но разрешает добавлять новых пользователей в базу данных. db_datareader – разрешает выполнение оператора SELECT для всех таблиц базы данных. db_datawriter – разрешает выполнять INSERT, UPDATE и DELETE для всех таблиц базы данных. db_ddladmin – позволяет добавлять, удалять и изменять объекты в базе данных. db_securityadmin – еще одна роль похожая на серверную роль securityadmin. В отличие от db_accessadmin, она не разрешает создавать новых пользователей в базе, но позволяет управлять ролями и членством в ролях, а также правами на доступ к объектам базы данных. db_backupoperator – позволяет создавать резервные копии базы данных. db_denydatareader – запрещает выполнение SELECT для всех таблиц базы данных. db_denydatawriter – запрещает выполнение INSERT, UPDATE и DELETE для всех таблиц базы данных. Просмотр информации о ролях баз данных (как встроенных, так и определенных пользователем) осуществляется с помощью процедуры sp_helprole, просмотр членов ролей баз данных – sp_helprolemember. Замечание. В каждой базе данных есть специальная роль Public. Она не может быть удалена. Каждый пользователь базы данных обязательно член этой роли. Обычно эту роль используют для предоставления некоторых разрешений всем пользователям данного сервера. Управление пользователями баз данных По умолчанию MS SQL Server имеет специальную учетную запись пользователя в базе данных: владелец БД (dbo – data base owner). Владелец базы данных имеет полную власть над БД, им автоматически становится тот, кто создал эту базу данных. 1. Для создания пользователя БД используют процедуры: sp_adduser [@loginame=] ‘учетная запись для входа’ [, [@name_in_db=] ‘имя пользователя’] [, [@grpname=] ‘роль’] sp_grantdbaccess [@loginame=] ‘учетная запись для входа’ [, [@name_in_db=] ‘имя пользователя’] Их отличие состоит в том, что sp_adduser позволяет сразу присвоить пользователю определенную роль базы данных. Эта процедура оставлена для обеспечения обратной совместимости и при работе вызывает процедуру sp_grantdbaccess. Обе эти хранимые процедуры будут удалены в последующих версиях MS SQL Server. Вместо них рекомендуется использовать следующую конструкцию: CREATE USER user_name [ { { FOR | FROM } { LOGIN login_name | CERTIFICATE cert_name | ASYMMETRIC KEY asym_key_name } | WITHOUT LOGIN ] [ WITH DEFAULT_SCHEMA = schema_name ] Описание параметров: user_name – имя пользователя в БД, должно быть не длиннее 128 символов. LOGIN login_name – указывает с каким логином необходимо ассоциировать данного пользователя. CERTIFICATE cert_name – указывает сертификат, с которым необходимо ассоциировать данного пользователя. ASYMMETRIC KEY asym_key_name – указывает ключ, с которым необходимо ассоциировать данного пользователя. WITH DEFAULT_SCHEMA = schema_name – задает схему по умолчанию для пользователя. При поиске объектов они сначала будут искаться в этой схеме. WITHOUT LOGIN – указывает, что пользователь не должен быть ассоциирован с существующим логином. 2. Отображение списка пользователей осуществляется в результате выполнения процедуры sp_helpuser. 3. Для удаления пользователя БД используются процедуры: sp_dropuser [@name_in_db=] ‘имя пользователя’ Эта хранимая процедура будет удалена в последующих версиях MS SQL Server. Вместо неё рекомендуется использовать следующую конструкцию: DROP USER ‘имя пользователя’ Пользователь не может быть удален, если он является владельцем объектов в базе данных. 4. Присвоение пользователю определенной роли осуществляется процедурой: sp_addrolemember [@rolename=] ‘роль’, [@membername=] ‘пользователь’ 5. Отмена присвоенной пользователю роли может быть выполнена с помощью процедуры: sp_droprolemember [@rolename=] ‘роль’, [@membername=] ‘пользователь’ 6. С целью упрощения администрирования системы безопасности сервера администратор имеет возможность создавать пользовательские роли баз данных и наделять их определенным набором полномочий. Для этого используется хранимая процедура: sp_addrole [@rolename=] ‘роль’ Для удаления созданной ранее роли: sp_droprole [@rolename=] ‘роль’ Таким образом, доступ к MS SQL Server осуществляется с помощью системы имен пользователей для входа, в системе же безопасности MS SQL Server пользователю предоставляются определенные права доступа к объектам данных. Не следует путать имя пользователя для входа и имя пользователя базы данных для доступа к объектам. Все описанные выше действия по организации системы безопасности можно выполнить также и с помощью графического интерфейса утилиты администрирования Management Studio. Управление учетными записями для входа Просмотр списка имеющихся учетных записей и их параметров осуществляется выбором группы Logins в папке Security сервера. Учетные записи пользователей отображаются в поле Name, в поле Default Database – имя базы данных, к которой пользователь подключается по умолчанию. Для создания новой учетной записи для входа необходимо выполнить команду New Login… контекстного меню узла Logins, в появившемся диалоговом окне указать (см. рис. 6.3): вкладка General: имя пользователя, тип аутентификации (при аутентификации средствами MS SQL Server – задать пароль), базу данных, к которой пользователь подключается автоматически, и язык по умолчанию; вкладка Server Roles: роли сервера, в которые будет входить создаваемая учетная запись; вкладка User Mapping: доступ к одной из созданных на сервере базе данных, в поле User ввести имя пользователя базы данных и включить создаваемого пользователя в одну существующих ролей. Рис. 6.3. Окно создания новой учетной записи Для изменения параметров существующей учетной записи пользователя для входа необходимо выбрать ее из списка и выполнить команду контекстного меню Properties, для удаления – Delete. Управление ролями сервера Для отображения списка ролей сервера необходимо выбрать группу Server Roles в папке Security сервера. Просмотр пользователей, входящих в эту роль и разрешений, присвоенный ей, осуществляется выполнением команды Действие – Свойства. Встроенные роли сервера не могут быть удалены из системы, и нельзя изменить определенные для них разрешения. Также запрещено создавать и собственные серверные роли. Управление пользователями баз данных Для просмотра и управления параметрами пользователей некоторой базы данных предназначена группа Security/Users этой базы. Учетные записи отображаются в поле User Name, а в поле Login Name – сответствующие им учетные записи для входа. Для создания нового пользователя базы данных необходимо выполнить команду New User…, затем в поле User name ввести имя пользователя, а в списке Login Name выбрать соответствующую учетную запись для входа (см. рис. 6.4). Можно также включить пользователя в роли базы данных. Рис. 6.4. Окно создания нового пользователя БД Для изменения параметров учетной записи служит команда Properties, а для удаления – Delete. Управление ролями базы данных Для отображения списка ролей базы данных используется группу Roles. Для просмотра пользователей, входящих в эту группу необходимо выполнить команду Properties. Разрешения пользователя Выполнение операторов языка Transact-SQL и действий в системе может быть выполнено только после успешной аутентификации пользователя. При получении оператора Transact-SQL от пользователя сервер проверяет, имеет ли право пользователь на выполнение соответствующих действий. Если права есть, то действие выполняется, в противном случае возвращается сообщение об ошибке. Действия, которые могут быть выполнены пользователем, определяются правами, выданными ему непосредственно, или ролью, в которой он состоит. Таким образом, пользователь должен иметь соответствующие разрешения на выполнение тех или иных действий. Права в MS SQL Server можно разделить на три категории: разрешения для объектов, разрешения для команд Transact-SQL и неявные разрешения. Для различных объектов применяются такие наборы разрешений как: SELECT. Пользователь с этой привилегией может выполнять запросы в таблице. INSERT. Пользователь с этой привилегией может добавлять данных в таблицу. UPDATE. Пользователь с этой привилегией может изменять данные в таблице. Нельзя назначить эту привилегию для определенных полей таблицы. DELETE. Пользователю с этой разрешено удалять данные из таблицы. ALL. Пользователю предоставлены любые разрешения. Разрешения для команд Transact-SQL контролируют возможность создания объектов в базе данных, создание самой базы данных и выполнение процедуры резервного копирования. Предоставление доступа Управление разрешениями пользователя на доступ к объектам базы данных осуществляется с помощью команды GRANT: GRANT { разрешение [,...n] }{ ON таблица | представление [(поле[,...n])] | ON [хранимая процедура[,...n] } TO учетная запись [,...n][WITH GRANT OPTION] Назначение аргументов этой команды: разрешение – список разрешений, предоставляемых пользователю. Если предоставляется несколько разрешений одновременно, то они разделяются запятыми; таблица, представление, хранимая процедура – указываются имена конкретных объектов текущей базы данных, для которых необходимо предоставить доступ. MS SQL Server обладает возможностью определять права доступа не только на уровне таблицы, но и на уровне поля; учетная запись – указывается имя объекта системы безопасности, которому предоставляются права. В качестве объекта может выступать как учетные записи пользователей, так и их группы; WITH GRANT OPTION – позволяет пользователю, которому предоставляются права, назначать их и для других пользователей. Например, с помощью следующей команды пользователю TestUser базы данных AdventureWorks предоставляются права выборки и изменения данных таблицы Orders этой базы данных: GRANT SELECT, UPDATE ON AdventureWorks2008.Production.WorkOrder TO TestUser Следующая команда предоставляет пользователю Andy права только выборки данных полей Name и ListPrice таблицы Product базы данных AdventureWorks: GRANT SELECT ON AdventureWorks2008.Production.Product (Name, ListPrice) TO Andy Запрещение доступа Для запрещения пользователю доступа к объектам базы данных используется команда DENY: DENY { разрешение [,...n] }{ ON таблица | представление [(поле[,...n])] | ON [хранимая процедура[,...n] } TO учетная запись [,...n][CASCADE] Параметры данной команды аналогичны параметрам командам GRANT. Параметр CASCADE позволяет отозвать права не только у конкретного пользователя, но также и у всех пользователей, кому он предоставил данные права. Неявное отклонение доступа Неявное отклонение подобно запрещению доступа с тем отличием, что оно действует только на том уровне, на котором определено. Т.е. если пользователю на определенном уровне доступ отклонен, то он может его получить на другом уровне, например, через членство в роли, имеющей на это право. Замечание. По умолчанию доступ пользователя к данным неявно отклонен. Для неявного отклонения доступа к данным используется следующая команда: REVOKE [GRANT OPTION FOR] { разрешение [,...n] }{ ON таблица | представление [(поле[,...n])] | ON [хранимая процедура[,...n] } TO учетная запись [,...n][CASCADE] Смысл параметров аналогичен параметрам команд GRANT и DENY. Параметр GRANT OPTION FOR используется, когда необходимо отозвать право, предоставленное параметром WITH GRANT OPTION команды GRANT. При этом пользователь сохраняет разрешение на доступ к объекту, но теряет возможность предоставлять разрешение другим пользователям. Замечание. Необходимо помнить следующий принцип: разрешение имеет самый низкий приоритет, а запрещение – самый высокий. Т.е. доступ к данным может быть получен только явным его предоставлением при отсутствии запрещения доступа на любом другом уровне. Если доступ явно не предоставлен, пользователь не может работать с данными. Работа с разрешениями пользователя может выполняться и с помощью графического интерфейса утилиты администрирования Management Studio. Чтобы назначить полномочия объекту безопасности необходимо выбрать его в группе Users (для изменения разрешения конкретного пользователя базы данных) или в группе Roles (для разрешений определенной роли). Для этих целей используется вкладка Securables (см. рис. 6.5). В появившейся вкладке перечислены все объекты базы данных, с возможными правами доступа. Можно установить одно из трех состояний доступа: предоставление (галочка), запрещение (крестик) и неявное отклонение (пустое поле) – в соответствующем поле. Рис. 6.5. Назначение прав пользователю БД Краткие итоги. Были рассмотрены ключевые компоненты системы безопасности MS SQL Server 2008, определено назначение серверных ролей и ролей БД. На примерах показаны способы разрешения или запрещения определенных действий пользователя на сервере. Лекция № 7 Тема: Структура баз данных в MS SQL Server Цель: познакомить со структурой базы данных в MS SQL Server 2008 и научить создавать базы данных и управлять ими. Планирование физической организации базы данных – важнейшая часть административной работы с базами данных, файлами и файловыми группами. Плохо физически организованная будет работать с меньшей производительностью. Создание и настройка базы данных СУБД MS SQL Server предлагает возможных вариантов создания базы данных: 1. Использование графического интерфейса Management Studio. 2. Использование команд SQL. Создание базы данных – это процесс указания имени файла, определения размеров и размещения файлов базы данных, а также определение параметров файла журнала транзакций. Можно выделить три типа файлов в базах данных MS SQL Server: 1. Первичные файлы данных. Как правило, используется расширение MDF. В любой базе данных есть один первичный файл, который содержит данные и расположение всех остальных файлов БД. 2. Вторичные файлы данных. Как правило, используется расширение NDF. Вторичным является любой файл кроме первичного и файлов журналов. БД могут не содержать ни одного вторичного файла. 3. Файлы журналов. Как правило, используется расширение LDF. В каждой БД существует по меньшей мере один файл журнала. Журнал транзакций содержит сведения об изменениях, происходящих в БД, т.е. при совершении некоторой транзакции (операции) в этот журнал заносятся сведения. Со временем этот журнал становится все больше, поэтому требуется следить за его размером. Основное назначение журнала транзакций – это обеспечение целостности данных. Он позволяет отменять сделанные изменения в БД. Для удобства администрирования и распределения нагрузки файлы можно объединять в файловые группы, которые делятся на два вида. 1. Первичные файловые группы. Сюда входят первичный файл и все файлы, которые явным образом не были помещены в другую группу. 2. Пользовательские файловые группы – это любая группа создаваемая пользователем в БД. Файлы журналов не входят ни в одну файловую группу, они обрабатываются отдельно от обычных файлов. Новая база данных представляет собой копию базы данных model, все параметры которой копируются в новую базу данных. По умолчанию базы данных имеют создавать только те пользователи, которым назначены роли sysadmin и dbcreator. Создание базы данных осуществляется с помощью команды: CREATE DATABASE имя_базы_данных [ON [PRIMARY] (NAME = ’логическое_имя_файла’, FILENAME = ’физическое_имя_файла’ [, SIZE = размер] [, MAXSIXE = {максимальный_размер | UNLIMITED} ] [, FILEGROWTH = шаг_приращения_размера [Mb | Kb | %] ) [ {FILEGROUP имя_файловой_группы} ] [, ...n ] [LOG ON (NAME = ’логическое_имя_файла’, FILENAME = ’физическое_имя_файла’ [, SIZE = размер] [, MAXSIXE = {максимальный_размер | UNLIMITED} ] [, FILEGROWTH = шаг_приращения_размера [Mb | Kb | %] ) [, ...n ] Описание параметров: PRIMARY – определяет файл как первичный или как член первичной файловой группы, если опущено, то основным файлом становится первый файл в операторе и для хранения используется первичная файловая группа; NAME – определяет логическое имя файла. По умолчанию совпадает с физическим именем файла, определенном в параметре FILENAME; FILENAME – указывает полный путь и имя физического файла; SIZE – указывает размер файла: в мегабайтах, килобайтах. Минимально возможное значение 512 Кб. Размер основного файла по умолчанию равен размеру БД model. По умолчанию размер дополнительных файлов данных и журнала равен 1 Мб; MAXSIZE – указывает максимальный размер, до которого может увеличиваться файл. Если этот параметр не указан, то устанавливается значение UNLIMITED, позволяющее увеличивать файлам размер без ограничений; FILEGROWTH – задает шаг увеличения файла, причем ноль означает запрет увеличения размера. Значение указывается в мегабайтах, килобайтах или процентах. По умолчанию приращение – 10%, если не указаны единицы, то цифра воспринимается в мегабайтах; FILEGROUP – определяет имя группы файлов, в которую помещается файл. Для просмотра информации о базе данных, файлах и группах файлов используются следующие хранимые процедуры: sp_helpdb [база_данных] – информация о базе данных и ее настройках. Если база данных не указана, то отображается отчет по всем базам данных, поддерживаемых данным MS SQL Server. sp_helpfile [‘имя’] – информация о файлах, относящихся к текущей базе данных. Если имя файла не указано, то отображается информация обо всех файлах этой базы данных. sp_helpfilegroup [‘имя’] – информация обо всех файловых группах в текущей базе данных. Если указано имя файловой группы, то выводится информация по каждому файлу указанной группы. sp_spaceused [‘объект’] – сведения о дисковом пространстве, используемом указанным объектом. Помимо перечисленных выше физических параметров база данных имеет еще и логические параметры. Только владелец и системный администратор может изменить эти параметры. Управление параметрами осуществляется с помощью системной хранимой процедуры sp_dboption: sp_dboption [ [@dbname=] ‘имя_базы’ ] [, [@option=] ‘’] [, [@value=] ON | OFF] Изменение базы данных Удаление базы данных осуществляется с помощью оператора: DROP DATABASE имя_базы_данных [, …n] В результате удаляются все файлы, используемые базой данных. Правом на удаление обладает владелец базы и пользователи роли sysadmin, это право не может быть передано другим учетным записям. Изменение владельца базы данных производится с помощью специальной хранимой процедуры. Владельцем можно сделать любую учетную запись, которая в настоящий момент не является пользователем базы, следующим образом: sp_changedbowner [ [@loginname=] ‘имя_пользователя’ Переименование базы данных: sp_renamedb [@old_name=] ‘старое_имя’, [@new_name=] ‘новое_имя’ Для переименования базы данных ее необходимо перевести в однопользовательский режим работы. Для управления уже существующими файлами журнала и файлами данных, добавления дополнительных файлов данных или журнала, удаления файлов, а также для работы с файловыми группами используется команда: ALTER DATABASE база_данных { ADD FILE <указание_на_файл> [TO FILEGROUP наименование] | ADD LOG FILE <указание_на_файл> | REMOVE FILE логическое_имя_файла | ADD FILEGROUP имя_группы | REMOVE FILEGROUP имя_группы | MODIFY FILE <указание_на_файл> | MODIFY FILEGROUP имя_группы свойство_группы } где <указание_на_файл> = (NAME = ’логическое_имя_файла’, FILENAME = ’физическое_имя_файла’ [, SIZE = размер] [, MAXSIXE = {максимальный_размер | UNLIMITED} ] [, FILEGROWTH = шаг_приращения_размера [Mb | Kb | %] ) Данная команда позволяет добавлять файл в существующую файловую группу, удалять файлы (при этом удаляется и физический файл), добавлять и удалять файловые группы, изменять физические параметры уже существующих файлов, а также изменять свойства файловых групп: READONLY, READWRITE, DEFAULT (при определении этого свойства, в эту группу будет заносится файлы, у которых в параметрах не определена принадлежность к группе; установленной по умолчанию изначально считается первичная файловая группа). Сжатие базы данных Сжатие базы данных – это процесс уменьшения размеров файлов базы данных за счет удаления неиспользуемых частей файла. Существует три способа сжатия базы данных: автоматическое сжатие при установке соответствующего параметра в настройках базы данных; удаление свободного пространства из файлов базы данных с помощью утилит администрирования MS SQL Server; уменьшение размера указанных файлов (или файловых групп), а также очистка содержимого файлов для их последующего удаления. Автоматическое сжатие данных выполняется постоянно с определенными интервалами, если установлен параметр базы данных autoshrink. При операциях автоматического сжатия нельзя определить, какую часть базы данных необходимо сжать. MS SQL Server пытается освободить значительную часть базы данных самостоятельно. Эти выполняются в период наименьшей активности пользователей. операции Сжатие всей базы данных вручную осуществляется с использованием следующей команды: DBCC SHRINKDATABASE (‘имя_БД’, [‘процент’] [, NOTRUNCATE | TRUNCATEONLY]) Описание параметров: имя_БД – имя базы данных, которую необходимо сжать; процент – количество процентов свободного пространства, которое желательно оставить после сжатия; NOTRUNCATE – сводное пространство не возвращается операционной системе, а резервируется в файлах, т.е. физически уменьшения размера базы данных не происходит; TRUNCATEONLY – свободное пространство удаляется за последним используемым в файле экстентом7, при этом данные не перемещаются, а параметр процент игнорируется. Права на сжатие базы данных выданы только членам роли sysadmin и владельцам базы данных. После сжатия базы данных выводится отчет, в котором указывается: количество страниц, до которых сжимается файл; расчетное число страниц, в которые могут быть помещены все данные файла; количество страниц, содержащих данные; количество страниц, на которые файл может быть еще сжат. Нельзя сжать базу данных до размера меньше первоначального. Сжатие базы данных можно осуществить также и путем сжатия каждого ее файла с помощью следующей команды: DBCC SHRINKFILE (‘имя_файла’, [‘конечный_размер’] [, EMPTYFILE | NOTRUNCATE | TRUNCATEONLY ]) Описание параметров: 7 Экстент – непрерывная область памяти на накопителе. имя_файла – логическое имя файла, который необходимо сжать; конечный_размер – желательный размер (целое число в мегабайтах), который должен иметь файл после выполнения сжатия. Если этот параметр не указан или меньше минимально допустимого размера, то файл сжимается до минимально возможного размера; EMPTYFILE – выполняется перенос данных из файла в другие файлы файловой группы; NOTRUNCATE – освободившееся место не возвращается операционной системе, т.е. размер файла не уменьшается на самом деле. При этом данные располагаются более компактно и смещаются к началу файла; TRUNCATEONLY – происходит обрезание файла, начиная с последней используемой страницы. Никакого перемещения данных не происходит. Резервное копирование данных Необходимо уделять особое внимание целостности информации, с которой работает пользователь. MS SQL Server предлагает следующие типы резервного копирования информации: полная копия базы данных, которая является отправной точкой при восстановлении базы данных после сбоя, однако в зависимости от объема данных этот процесс может занимать много времени, поэтому не рекомендуется выполнять его слишком часто. Полная копия содержит все данные, содержащиеся в базе данных на момент окончания резервирования; копия журнала транзакций, необходима для фиксирования всех изменений данных, произошедших в системе с момента последнего резервного копирования. Сама копия журнала содержит сведения о транзакциях и лишь только вместе с копией базы данных позволяет вернуться к состоянию, предшествующему сбою; дифференциальная копия данных содержит изменения данных, произошедшие с момента последнего создания полной копии базы данных. При этом сохраняются только страницы подвергшиеся изменениям. Таким образом, для восстановления базы данных достаточно самой последней дифференциальной копии. Для выполнения резервного копирования необходимо выбрать носитель, т.е. определить устройство, которое будет использоваться для создания копий. Для добавления устройства используется хранимая процедура: sp_addumpdevice ‘тип_устройства’, ‘логическое_имя’, ‘физическое_имя’ Описание параметров: тип_устройства – тип устройства резервного копирования. Допустимые значения: TAPE (магнитная лента), DISK (магнитный диск); логическое_имя, физическое_имя – логическое и физическое имя устройства резервного копирования соответственно. Для создания резервной копии базы данных, журнала транзакций, файлов и файловых групп необходимо воспользоваться командой: BACKUP {LOG | DATABASE } имя_БД [ FILE = ‘логическое_имя_файла’, ...] [ FILEGROUP = ‘имя_группы’ ] TO логическое_имя_устройства [ WITH [ DESCRIPTION = ‘комментарий’ ] [ DIFFERENTIAL ] [ EXPIREDATE = ‘дата’ ] [ INIT | NOINIT ] ... ] Описание параметров: DIFFERENTIAL – создается дифференциальная копия базы данных; EXPIREDATE – определяется дата, после которой резервная копия считается устаревшей и может быть перезаписана; INIT | NOINIT – система осуществляет или нет инициализацию устройства. Восстановление базы данных При восстановлении базы данных из резервной копии существующая база данных будет перезаписана. Для восстановления базы данных используется команда: RESTORE {LOG | DATABASE } имя_БД ‘файл_или_файловая_ группа’ [ FROM логическое_имя_устройства ] [ WITH [ DBO_ONLY ] [ MOVE ‘логическое_имя_файла’ TO ‘физическое_имя’ ] ... ] Описание параметров: DBO_ONLY – разрешается доступ к восстановленной базе только владельцам; MOVE – указывает, какое физическое имя будет соответствовать восстанавливаемому файлу. По умолчанию файл восстанавливается с тем же физическим именем, которое было определено при резервном копировании. Краткие итоги. Изучены основные физические элементы базы данных: первичные файлы, файловые группы, журнал. Продемонстрировано создание новой БД и управление ею. Показаны возможности резервного копирования и сжатия БД. Лекция № 8 Тема: Реляционная модель данных Цель: рассмотреть основные элементы реляционных баз данных. Реляционные объекты данных Реляционная модель включает три составные части: 1. Объекты. 2. Целостность. 3. Операторы. Рассмотрим объект на рис. 8.1. степень атрибуты ключ Код 1 2 3 4 Имя Сергей Иван Петр Василий Фамилия Петров Казаков Васин Иванов ДатаРождения 01.01.2001 12.08.2003 25.03.2002 02.01.2002 кортежи домен Рис. 8.1. Основные элементы реляционной БД кардинальное число Отношение соответствует тому, что мы обычно называем таблицей. Кортеж соответствует экземпляру записи, атрибут – полю таблицы, степень – количеству атрибутов, кардинальное число – количеству кортежей. Домены Домен – это общее множество значений, из которых берутся конкретные значения определенного атрибута некоторого отношения. Домены также можно определить как именованное множество скалярных значений одного типа. Скалярное значение (скаляр) – это наименьшая семантическая единица данных, которая является отдельным значением данных. У скаляров нет внутренней структуры, т.е. они не разложимы в данной реляционной модели. На самом деле, в других контекстах скаляры могут иметь внутреннюю структуру (например, фамилия состоит из букв), но для конкретной таблицы это разложение не имеет смысла, т.к. теряется его значение. Каждый атрибут должен быть определён на единственном домене. Например, атрибут StudentID определён на домене {1, 2, 3, ..., 10}, атрибут GroupID – на домене {1, 2, 3, ..., 10}, но это будут разные домены, хотя и содержат одинаковые элементы. Не обязательно все элементы домена должны использоваться в конкретном отношении. Основное значение доменов состоит в том, что они ограничивают операции сравнения. Пример: рассмотрим запрос SELECT * FROM Stduents, Groups WHERE GroupsID.GroupID = Students.StudentID Такой запрос не имеет смысла, поскольку мы сравниваем числовые значения из разных доменов. Правильно будет так: WHERE GroupsID.GroupID = Students.GroupID Отношения Отношение можно рассматривать с двух сторон: 1) переменная отношения – это обычная переменная (как в любом языке программирования), т.е. именованный объект, значение которого может изменяться; 2) значение отношения – это значение этой переменной в конкретный момент времени. Уточним определение отношения: Отношение R, заданное на множестве доменов D1, D2, …, Dn, которые не обязательно различны, содержит две части: заголовок и тело. Заголовок содержит фиксированное множество пар Ai : Di , где Ai – имя атрибута. Тело содержит множество кортежей, каждый из которых в свою очередь содержит множество значений Zji, где i – номер атрибута, j – номер кортежа. Свойства отношений: 1) нет одинаковых кортежей, поскольку тело отношений представляет собой множество; 2) кортежи неупорядочены, т.е. нет таких понятий, как «первый» или «десятый» кортеж, нет понятий «предыдущий» и «следующий»; 3) атрибуты неупорядочены, т.к. заголовок отношения тоже определён как множество; 4) все значения атрибутов неделимы, т.к. домен содержит неделимые элементы. Такие отношения, которые не содержат делимых атрибутов, называются нормализованными, или представленными в первой нормальной форме. Целостность реляционных данных В каждый момент времени любая БД содержит конкретную конфигурацию значений, которая представляет определённое состояние объекта реального мира. Следовательно, БД нуждается в определении правил целостности, чтобы информировать СУБД об ограничениях реального мира. Например, для атрибутов «рост», «вес» необходимо ограничение неотрицательности. Такого рода правила, характерные для конкретной БД, называются специфическими. Кроме специфических правил существуют общие правила целостности для всех БД. Такие правила связаны с потенциальными, первичными и внешними ключами и будут рассмотрены далее в этой лекции. Потенциальные ключи Пусть R – некоторое отношение. Тогда потенциальный ключ K для R – это подмножество атрибутов R, обладающих следующими свойствами: 1) уникальность, т.е. нет двух различных кортежей в текущем значении переменной отношения R с одинаковым значением K; 2) неизбыточность, т.е. никакое из подмножеств K не обладает свойством уникальности. Это свойство применимо только для случая, если потенциальный ключ состоит более чем из одного атрибута. Например, нельзя назначить потенциальным ключом совокупность полей StudentID и Name, иначе этот ключ будет избыточным. Могут существовать отношения, в которых единственным естественным потенциальным ключом будет комбинация всех атрибутов, но это может быть неудобно. Тогда вводят искусственный потенциальный ключ. Например, в таблице Students совокупность атрибутов {Name, GroupID, Birthdate} представляет собой ключ, но удобнее ввести искусственный ключ – StudentID. StudentID 1 2 4 Name GroupID 2 1 2 Казаков Петр Васильев Иван Шишкина Дарья BirthDate 23.04.1990 11.05.1991 23.09.1991 Потенциальные ключи предназначены для обеспечения основного механизма адресации на уровне кортежей, т.е. достаточно указать значение потенциального ключа, по которому можно найти любой кортеж. Первичные и альтернативные ключи Отношение может иметь более одного потенциального ключа, но один из них всегда выбирается в качестве первичного, остальные потенциальные ключи будут в этом случае называться альтернативными. Например, в таблице Groups: GroupID 1 2 Name ПМ-41 ПМ-51 GroupID – первичный ключ, а Name – альтернативный. В каждом отношении всегда должен быть один и только один первичный ключ. Внешние ключи Пусть R2 – отношение. Тогда внешний ключ FK в отношении R2 – это подмножество множества атрибутов R2 такое, что: 1) существует базовое отношение R1 с потенциальным ключом CK; 2) каждое значение FK в текущем значении R2 всегда совпадает со значением CK некоторого кортежа в текущем значении R1. Из данного определения можно вывести такие следствия: 1) по определению каждое значение внешнего ключа должно являться значением соответствующего потенциального ключа, но обратное не требуется, т.е. потенциальный ключ может содержать значения, которые в данный момент не являются значением внешнего ключа; 2) данный внешний ключ будет составным тогда и только тогда, когда соответствующий потенциальный ключ тоже составной; 3) каждый атрибут, входящий в данный внешний ключ, должен быть определён на том же домене, что и соответствующий атрибут потенциального ключа; 4) R1 и R2 не обязательно различны. Рассмотрим отношение Students: StudentID 1 2 4 Name Казаков Петр Васильев Иван Шишкина Дарья GroupID 2 1 2 BirthDate 23.04.1990 11.05.1991 23.09.1991 Атрибут GroupID будет являться внешним ключом, т.к. к нему проведена связь от таблицы Groups. В связи с внешними ключами вводится ещё ряд терминов. Говорят, что значение внешнего ключа представлено ссылкой к кортежу, содержащему соответствующее значение потенциального ключа. Этот кортеж называется ссылочным, или целевым. Отношение, которое содержит ссылочный ключ, называется ссылающимся отношением, а отношение, которое содержит соответствующий ключ, называется ссылочным, или целевым (target relation). Существует правило ссылочной целостности: БД не должна содержать несогласованных значений внешних ключей. Несогласованное значение – это такое значение, для которого нет потенциального ключа в ссылочном отношении. Это правило эквивалентно определению внешнего ключа. Правила внешних ключей Правило целостности связано с состоянием БД в конкретный момент времени. Следовательно, необходим механизм, позволяющий поддерживать БД целостной. Для этого требуется определить операции, которые могут нарушить целостность, и либо запретить их, либо ввести дополнительные компенсирующие операции, которые будут исправлять временное нарушение целостности БД. Например, нам необходимо удалить группу ПМ-51 из отношения Groups. Если мы просто удалим соответствующий кортеж из таблицы Groups, мы нарушим целостность, т.к. в таблице Students останутся студенты, принадлежащие уже несуществующей группе. Именно для таких случаев разрабатываются компенсирующие операции. Таким образом, для БД необходимо предусмотреть компенсирующие операции для двух моментов: 1) удаление объекта ссылки внешнего ключа, т.е. ссылочного кортежа; 2) изменение (обновление) потенциального ключа, на который имеется ссылка. Для компенсации этих операций существуют как минимум две возможности: 1. Ограничить выполнение операции. Для операции удаления – не удалять кортеж, пока не удалят все ссылающиеся кортежи, т.е. отложить удаление; 2. Каскадировать. Здесь возможно несколько вариантов, например при удалении: удалить сам кортеж и все соответствующие ссылающиеся кортежи; удалить сам кортеж, а для всех ссылающихся кортежей исправить значение на правильное, например, установить NULLзначение для данного атрибута. NULL-значение Иногда требуется возможность обозначить отсутствие информации, которая является необязательной в данном отношении. Например, для отношения Students таким необязательным атрибутом может являться Height (рост студента). Проблему можно решить двумя способами. 1. Использовать специальные значения того же типа данных, что и сам атрибут. Например, атрибут Height имеет тип int, тогда можно использовать –1 для обозначения отсутствия информации о росте студента, а любое другое число будет указывать сам рост. 2. Использовать специальные универсальные маркеры – NULLзначения. Эдгар Кодд8 предложил второй вариант, главным преимуществом которого является то, что NULL-значение некоторого атрибута свидетельствует именно о его отсутствии, т.е. это не то же самое, что и число ноль или пустая строка. Однако такие неопределённые значения могут вызвать осложнения при обеспечении целостности БД. 8 Эдгар Ф. Кодд (Edgar F. Codd) (1923-2003) – американский ученый английского происхождения. Долгое время работал в корпорации IBM. Создал основы теории реляционных баз данных. Сформулировал 12 законов аналитической обработки данных и ввел термин OLAP (On-Line Analytical Processing – оперативная аналитическая обработка). Среди специалистов разделились мнения относительно необходимости этих меток. Э. Кодд считает, что они должны быть неотъемлемой частью БД, а К. Дейт9, наоборот, полагает, что они даже вредны. В общем случае в БД для каждого атрибута можно задать, разрешено или не разрешено содержать NULL-значение. Рассмотрим влияние NULL-значения на различные ключи. С использованием этого значения вводится правило целостности объектов: ни один элемент первичного ключа базового отношения не может быть NULL-значением. Это правило объясняется следующим: кортежи отношений соответствуют объектам реального мира, следовательно, эти объекты различны, т.е. некоторым образом опознаваемы, а первичные ключи выполняют функцию уникальной идентификации. Правило обеспечения целостности применимо только: 1) к базовым отношениям, а не вычисляемым (производным); 2) к первичным ключам, а для альтернативных может быть разрешено или запрещено использование NULL-значения. NULL-значения могут использоваться либо при вставке и изменении записи (для обозначения отсутствия информации) или при каскадном удалении. Например, мы хотим удалить группу, но при этом не удалять студентов этой группы. В этом случае в поле GroupID отношения Students мы можем указать NULL-значение для всех студентов, которые принадлежат удаляемой группе. StudentID 1 2 4 GroupID 1 2 Name GroupID 2 1 2 Казаков Петр Васильев Иван Шишкина Дарья BirthDate 23.04.1990 11.05.1991 23.09.1991 Name ПМ-41 ПМ-51 После удаления группы ПМ-51, получим следующее состояние отношения Students: StudentID 1 2 4 Name Казаков Петр Васильев Иван Шишкина Дарья GroupID NULL 1 NULL BirthDate 23.04.1990 11.05.1991 23.09.1991 Кристофер Дж. Дейт (Christopher J. Date) (р.1941) – английский ученый, работавший над теорией реляционных баз данных совместно с Э.Коддом. 9 Краткие итоги. Рассмотрены основные элементы реляционных баз данных, а также вопросы целостности данных. Даны определения первичных и внешних ключей. Лекция № 9 Тема: Операторы реляционной алгебры Цель: познакомить с основными реляционными операторами. Понятие реляционной алгебры Реляционная алгебра – это набор операций, которые принимают отношения в качестве операндов и возвращают отношение в качестве результата. Первая версия этой алгебры была определена Э. Коддом. В основе всех реляционных БД лежит использование реляционной алгебры, которая обеспечивает запись выражений для реализации на некотором языке, например, SQL. Если возможности языка как минимум соответствуют возможностям, обеспеченным алгебраическими операциями, то его называют реляционно полным. Обычно выделяют 8 основных операторов реляционной алгебры и несколько дополнительных (их количество меняется со временем). Мы рассмотрим два дополнительных оператора: расширения и подведения итогов. Основные операторы реляционной алгебры Реляционная алгебра включает восемь основных операций, которые подразделяются на две группы, в каждую из которых входит четыре операции. 1. Традиционные операции с множествами, модифицированные для таблиц (отношений). 1) Объединение: A UNION B Результатом операции объединения является отношение, содержащее все кортежи, принадлежащие одному из двух или обоим отношениям. В отличие от объединения множеств, результатом объединения отношений должно стать отношение, а не набор разнородных кортежей. При объединении должны соблюдаться два условия: отношения должны быть совместимы по типу, т.е. иметь одно и то же множество атрибутов, определённых на одних и тех же доменах; результатом каждой операции должно быть также отношение (свойство замкнутости). Пусть имеется отношение Students: StudentID 1 2 4 Name Казаков Петр Васильев Иван Шишкина Дарья GroupID 2 1 2 BirthDate 23.04.1990 11.05.1991 23.09.1991 И отношение Teachers: TeacherID 1 Кислицын О.П. 2 Царев С.М. 4 Пестов Д.Н. Name BirthDate 1.2.1970 10.03.1964 2.05.1980 Нам требуется вывести список всех преподавателей и студентов с указанием их дня рождения. Для этого можно использовать следующие операторы SQL: SELECT Name, BirthDate FROM Students UNION SELECT Name, BirthDate FROM Teachers Результатом выполнения будет следующее отношение: Name BirthDate 23.04.1990 11.05.1991 23.09.1991 1.2.1970 10.03.1964 2.05.1980 Казаков Петр Васильев Иван Шишкина Дарья Кислицын О.П. Царев С.М. Пестов Д.Н. 2) Пересечение: A INTERSECT B Результатом операции пересечения является отношение, содержащее кортежи, которые принадлежат обоим отношениям. Для операции пересечения необходимы те же два условия, что и для объединения: совместимость по типу и замкнутость. Пример: рассмотрим отношение Teachers (преподаватели) и Supervisors (кураторы, могут руководить преподавателями): Teachers: TeacherID 1 Кислицын О.П. 2 Царев С.М. Name BirthDate 1.2.1970 10.03.1964 4 Пестов Д.Н. 2.05.1980 Supervisors: SupervisorID 1 Кислицын О.П. 2 Царев С.М. 4 Нечаев Н.В. Name BirthDate 1.2.1970 10.03.1964 12.08.1970 Требуется вывести всех преподавателей (из таблицы Teachers), которые одновременно являются кураторами. SELECT Name FROM Teachers INTERSECT SELECT Name FROM Supervisors Результатом выполнения запроса будет: Name Кислицын О.П. Царев С.М. 3) Вычитание: A MINUS B Результатом операции вычитания является отношение, которое содержит все кортежи, принадлежащие первому отношению и не принадлежащие второму отношению. Условия необходимы те же: совместимость по типу и замкнутость. Пример: рассмотрим отношение Teachers (преподаватели) и Supervisors (кураторы, могут руководить преподавателями): Teachers: TeacherID 1 Кислицын О.П. 2 Царев С.М. 4 Пестов Д.Н. Name BirthDate 1.2.1970 10.03.1964 2.05.1980 Supervisors: SupervisorID 1 Кислицын О.П. 2 Царев С.М. 4 Нечаев Н.В. Name BirthDate 1.2.1970 10.03.1964 12.08.1970 Требуется вывести всех преподавателей (из таблицы Teachers), которые одновременно являются кураторами. SELECT Name FROM Teachers EXCEPT SELECT Name FROM Supervisors Результатом выполнения запроса будет: Name Пестов Д.Н. 4) Произведение: A TIMES B Результатом является отношение, содержащее все возможные кортежи, которые являются сочетанием двух кортежей, принадлежащих двум отношениям. Для произведения необходимо свойство замкнутости, т.е. результатом является не просто множество пар кортежей, а множество целых кортежей. В реляционной алгебре каждая пара кортежей заменяется одним благодаря сцеплению (сцепление – это объединение в смысле теории множеств, а не реляционной алгебры). При произведении может возникнуть проблема одинаковых имён атрибутов. В этом случае одно из конфликтующих полей необходимо переименовать. Пример: рассмотрим отношения Students и Courses (учебные курсы): Students: StudentID 1 2 4 Name Казаков Петр Васильев Иван Шишкина Дарья GroupID 2 1 2 BirthDate 23.04.1990 11.05.1991 23.09.1991 Courses: CourseID 1 2 3 Name Базы данных Технологии программирования Программирование в среде С++ Требуется для каждого студента вывести список всех доступных учебных курсов. Составим следующий код: SELECT Students.Name AS ‘Student’, Courses.Name AS ‘CourseName’ FROM Students CROSS JOIN Courses Результат выполнения запроса: Name Name Казаков Петр Базы данных Васильев Иван Базы данных Шишкина Дарья Базы данных Казаков Петр Технологии программирования Васильев Иван Технологии программирования Шишкина Дарья Технологии программирования Казаков Петр Программирование в среде С++ Васильев Иван Программирование в среде С++ Шишкина Дарья Программирование в среде С++ 2. Специальные реляционные операции. 1) Выборка (или ограничение) Результатом выборки является отношение, содержащее все кортежи из исходного отношения, которые удовлетворяют определённому условию. Пусть дано следующее отношение Students: StudentID 1 2 4 5 6 Name Казаков Петр Васильев Иван Шишкина Дарья Драгомиров Евгений Васнецова Евгения GroupID 2 1 2 1 2 Выберем лишь тех студентов, которые принадлежат группе 2: SELECT * FROM Students WHERE GroupID = 2 Результатом выполнения будет отношение: StudentID 1 Казаков Петр 4 Шишкина Дарья 6 Васнецова Евгения 2) Проекция Name GroupID 2 2 2 Результатом проекции является отношение, содержащее все кортежи после удаления из них некоторых атрибутов. В этом случае результирующие кортежи называются подкортежами. Обратим внимание на два момента: 1) возможно указание всех атрибутов исходного отношения для проекции – получится тождественная проекция; 2) возможно указать пустой список атрибутов – получится нулевая проекция. Осуществить проекцию необходимых атрибутов. можно указанием после SELECT списка Пусть дано следующее отношение Students: StudentID 1 2 4 Name Казаков Петр Васильев Иван Шишкина Дарья GroupID 2 1 2 BirthDate 23.04.1990 11.05.1991 23.09.1991 Выберем из таблицы только имена и даты рождений: SELECT Name, BirthDate FROM Students Результатом выполнения будет отношение: Name Казаков Петр Васильев Иван Шишкина Дарья BirthDate 23.04.1990 11.05.1991 23.09.1991 3) Соединение Результат соединения – это отношение, кортежи которого являются сочетанием двух кортежей, принадлежащих двум начальным отношениям и имеющих общие значения для одного или нескольких атрибутов (общее значение в результирующем отношении появляется только один раз). Пусть дано следующее отношение Students: StudentID 1 2 4 Name Казаков Петр Васильев Иван Шишкина Дарья и отношение Groups: GroupID 2 1 2 BirthDate 23.04.1990 11.05.1991 23.09.1991 GroupID 1 2 3 GroupName ПМ-11 ПМ-12 ПМ-21 Соединим эти таблицы по полю GroupID и выведем имя студента и название учебной группы: SELECT Name, GroupName FROM Students INNER JOIN Groups ON Students.GroupID = Groups.GroupID Результатом выполнения будет отношение: Name Казаков Петр Васильев Иван Шишкина Дарья GroupName ПМ-12 ПМ-11 ПМ-12 Это соединение обладает свойствами ассоциативности и коммутативности. 4) Деление: A DIVIDEBY B Результатом деления двух отношений (бинарного и унарного) является отношение, содержащее все значения атрибута первого бинарного отношения, которые соответствуют всем значениям унарного отношения. Эта операция не имеет аналога в MS SQL Server 2008, поэтому рассмотрим на примере деления отношения R1 на R2: R1: A X A Y B Z B X C Y R2: X Y В результате получится отношение: R: A Операции расширения и подведения итогов После того, как Э. Кодд предложил восемь основных операций, многочисленные авторы предложили новые алгебраические операции. Мы рассмотрим лишь две из них – расширение и подведение итогов. Эти операции удачно дополняют основной набор и являются наиболее востребованными. 1. Расширение С помощью операции расширения из отношения создаётся новое отношение, содержащее новый атрибут, значения которого получены посредством скалярных вычислений. Пусть дано следующее отношение Teachers: TeacherID 1 Кислицын О.П. 2 Царев С.М. 4 Пестов Д.Н. Name BirthDate 1.2.1970 10.03.1964 2.05.1980 Добавим новый атрибут Age, который будет показывать, сколько полных лет исполнилось преподавателю: SELECT TeacherID, Name, BirthDate, DATEDIFF(YEAR, BirthDate, GetDate()) AS ‘Age’ FROM Teachers Результатом выполнения будет отношение: TeacherID 1 Кислицын О.П. 2 Царев С.М. 4 Пестов Д.Н. Name BirthDate 1.2.1970 10.03.1964 2.05.1980 Age 39 45 29 2. Подведение итогов Операция подведения итогов даёт возможность "вертикальных" вычислений. Для этого используются агрегатные функции, которые для набора значений возвращают одно единственное. Наиболее распространенные функции: Sum, Count, Avg, Min, Max. Пусть дано следующее отношение Students: StudentID 1 Казаков Петр 2 Васильев Иван Name GroupID 2 1 4 5 6 Шишкина Дарья Драгомиров Евгений Васнецова Евгения 2 1 2 Требуется подсчитать, сколько студентов в каждой группе: SELECT GroupID, Count(StudentID) as ‘StudentCount' FROM Students GROUP BY GroupID Результатом выполнения будет отношение: GroupID 1 2 StudentCount 2 3 Операторы обновления Предназначены для управления данными в таблицах. Существует три операции обновления. 1) Вставка записи Позволяет добавлять одну или несколько новых записей в отношение. Пусть имеется отношение Students: StudentID 1 Казаков Петр 2 Васильев Иван 4 Шишкина Дарья Name GroupID 2 1 2 Чтобы добавить в него две новые записи, можно использовать следующие операторы SQL: INSERT INTO Students (Name, GroupID) VALUES (‘Драгомиров Евгений’, 1) INSERT INTO Students (Name, GroupID) VALUES (‘Васнецова Евгения’, 2) После выполнения, отношение Students будет выглядеть следующим образом: StudentID 1 Казаков Петр 2 Васильев Иван 4 Шишкина Дарья Name GroupID 2 1 2 5 6 Драгомиров Евгений Васнецова Евгения 1 2 2) Удаление записи. Удаляет все записи из отношения, или только записи, удовлетворяющие заданному критерию. Пусть имеется отношение Students: StudentID 1 2 4 5 6 Name GroupID 2 1 2 1 2 Казаков Петр Васильев Иван Шишкина Дарья Драгомиров Евгений Васнецова Евгения Чтобы удалить из него студентов, входящих в группу с номером 1, можно использовать следующие операторы SQL: DELETE Students WHERE GroupID = 1 После выполнения, отношение Students будет выглядеть так: StudentID 1 Казаков Петр 4 Шишкина Дарья 6 Васнецова Евгения Name GroupID 2 2 2 Если не указать раздел WHERE в операторе DELETE, то будут удалены все записи из таблицы. 3) Обновление записи Позволяет обновлять значения определенных записей. указанных полей всех или только Пусть имеется отношение Students: StudentID 1 2 4 5 6 Name Казаков Петр Васильев Иван Шишкина Дарья Драгомиров Евгений Васнецова Евгения GroupID 2 1 2 1 2 Чтобы перевести всех студентов, входящих в группу с номером 1, в группу с номером 2, можно использовать следующие операторы SQL: UPDATE Students SET GroupID = 2 WHERE GroupID = 1 После выполнения, отношение Students будет выглядеть следующим образом: StudentID 1 2 4 5 6 Name Казаков Петр Васильев Иван Шишкина Дарья Драгомиров Евгений Васнецова Евгения GroupID 2 2 2 2 2 Краткие итоги. Рассмотрены основные операции над таблицами, а также были приведены примеры использования этих операций на языке SQL. Лекция № 10 Тема: Первые нормальные формы Цель: ввести определения первых трех нормальных форм и обосновать необходимость их применения. Процесс нормализации Процесс нормализации основывается на концепции нормальных форм. Говорят, что отношение находится в определенной нормальной форме, если оно удовлетворяет заданному набору условий. На рис. 10.1 показано несколько нормальных форм, которые определены к настоящему времени. Первые три были описаны Э. Коддом, следующую формулу вывели Р. Бойс и Э. Кодд (НФБК – нормальная форма Бойса-Кодда), а четвёртую и пятую нормальные формы определил Р. Фейгин. Отношения в 1НФ Отношения во 2НФ Отношения в 3НФ Отношения в НФБК Отношения в 4НФ Отношения в 5НФ Рис. 10.1. Уровни нормализации Из рис. 10.1 видно, что отношение в некоторой нормальной форме предусматривает приведение его к предыдущей нормальной форме. Понятия первых нормальных форм основано на функциональных зависимостях (ФЗ) и процессе декомпозиции. Поэтому прежде всего требуется дать определение функциональных зависимостей, рассмотреть правила их вывода, а также возможность и необходимость декомпозиции некоторых отношений. Понятие функциональной зависимости Пусть R – это отношение. С одной стороны, оно имеет конкретное (постоянное) значение в данный момент времени. С другой стороны, это переменная, которая в каждый момент времени может принять некоторое новое значение. Понятие ФЗ можно применить и к первому, и ко второму случаю. Однако мы будем рассматривать только второй случай, т.к. он больше соответствует реальности. Определение функциональной зависимости. Пусть R – переменная отношения. X и Y – произвольные подмножества множества атрибутов R. Тогда Y функционально зависит от X, что в символическом виде записывается как X → Y (читается как «X функционально определяет Y») тогда и только тогда, когда для любого допустимого значения R каждое значение X связано точно с одним значением Y. Здесь X называют детерминантом ФЗ, а Y – зависимой частью ФЗ. Пример: Пусть R – это отношение Students. X – код студента, а Y – множество всех атрибутов студента. Тогда X → Y, т.к. X представляет собой первичный ключ, который уникально идентифицирует запись в таблице Students. Такое утверждение будет верно и для более общего случая: если X – это потенциальный ключ, то множество всех атрибутов R всегда функционально зависит от X. Однако следует иметь в виду, что если в R имеется ФЗ, левая часть которой не включает потенциальный ключ, то R обладает избыточностью, что затрудняет обеспечение целостности данных и занимает лишние ресурсы системы. Если ни один атрибут не может быть опущен из левой части, то такая функциональная зависимость называется неприводимой (точнее, неприводимой слева). Пример: {StudentID, FirstName, LastName, MiddleName} → {BirthDate} – приводимая ФЗ. {StudentID} → {BirthDate} – неприводимая ФЗ. Множество функциональных зависимостей называется неприводимым тогда и только тогда, когда оно обладает всеми тремя перечисленными ниже свойствами: 1. Зависимая часть каждой функциональной зависимости содержит только один атрибут. 2. Детерминант неприводимым. каждой функциональной зависимости является 3. Ни одна функциональная зависимость из множества не может быть удалена без потери информации о связях. Рассмотрение множества неприводимых ФЗ важно для нормализации отношений. Выделяют два вида ФЗ: 1. Тривиальные ФЗ – это ФЗ, в которых правая часть (Y) является подмножеством левой части (X). С практической точки зрения они не представляют значительного интереса, однако с точки зрения формальной теории зависимостей необходимо учитывать их наличие. 2. Нетривиальные ФЗ. Они действительно являются ограничениями целостности данных, поэтому в дальнейшем мы будем рассматривать именно нетривиальные ФЗ. Для определения того в какой нормальной форме находится отношение, требуется найти все ФЗ. Существуют три правила Армстронга (шведский математик), позволяющие из начального множества ФЗ вывести возможные ФЗ. Пусть A, B, C – это подмножества множества атрибутов отношения R, AB – объединение этих подмножеств. 1. Правило рефлексивности. Если множество B является подмножеством множества А, то А → В. (По сути, это определение тривиальной зависимости.) 2. Правило дополнения. Если А → B, то АС → ВС. 3. Правило транзитивности. Если А → B и B→C, то А → С. Каждое из этих правил может быть доказано на основе определения ФЗ. Однако в целях упрощения получения всех ФЗ можно вывести еще несколько дополнительных правил (пусть D – это еще одно произвольное подмножество множества атрибутов R): 4. Правило самоопределения. А → А. 5. Правило декомпозиции. Если А → ВС, то А → B и A → C. 6. Правило объединения. Если А → В и А → С, то А → ВС. 7. Правило композиции. Если А → B и С → D, то АС → BD. 8. Теорема всеобщего объединения. Если А→ B и C → D, то А( С – В ) → BD. Название теоремы указывает на то, что некоторые из перечисленных выше правил могут быть выведены как частные случаи этой теоремы. Однако следует иметь в виду, что эти правила не обеспечивают чёткого алгоритма получения всех ФЗ. Более того, такого алгоритма не существует. Единственный путь – это перебор всех вариантов. Декомпозиция без потерь Существенным аспектом процедуры нормализации является декомпозиция – разбиение отношения на производные. При этом такое разбиение не должно повлечь за собой потерю информации. Если отношение разбито на два без потерь, то это разбиение можно назвать обратимым, т.е. можно произвести обратное соединение. Пример: рассмотрим отношение Students: StudentID 1 2 4 LastName Казаков Васильев Шишкина FirstName MiddleName GroupID BirthDate Петр Владимирович 1 1.1.1992 Иван Аркадьевич 2 23.09.1990 Дарья Сергеевна 1 12.5.1991 1-й вариант декомпозиции. Разобьем Students на два следующих отношения: StudentID 1 2 4 LastName Казаков Васильев Шишкина FirstName MiddleName GroupID Петр Владимирович 1 Иван Аркадьевич 2 Дарья Сергеевна 1 GroupID BirthDate 1 1.1.1992 2 23.09.1990 При таком варианте разбиения некоторая информация утрачивается: невозможно определить верную дату рождения (BirthDate) каждого студента. 2-й вариант декомпозиции. Разобьем Students на два следующих отношения: StudentID 1 2 4 LastName Казаков Васильев Шишкина FirstName MiddleName GroupID Петр Владимирович 1 Иван Аркадьевич 2 Дарья Сергеевна 1 StudentID BirthDate 1 1.1.1992 2 23.09.1990 4 12.5.1991 Это декомпозиция без потерь, поскольку эти два отношения можно объединить и получится исходное отношение Students. Можно заметить, что процесс декомпозиции фактически представляет собой операции проекции, т.к. каждое полученное при декомпозиции отношение состоит из подмножества полей исходного отношения. Чтобы гарантировать, что после декомпозиции обратное соединение отношений даст исходное, воспользуемся теоремой Хита. Теорема Хита Пусть R{А, B, С} – это отношение, где А, B и C – множества атрибутов этого отношения. Если R удовлетворяет функциональной зависимости А→ B, то R равна соединению ее проекций по атрибутам {А, В} и {А, С}. Первая, вторая и третья нормальные формы Первая нормальная форма (1НФ). Отношение находится в 1НФ тогда и только тогда, когда все используемые домены содержат только скалярные значения, т.е. значения всех полей отношения должны быть неделимы. Пусть дано следующее отношение Students: StudentID 1 2 4 Name Казаков Петр Владимирович Васильев Иван Аркадьевич Шишкина Дарья Сергеевна Поле Name содержит одновременно фамилию, имя и отчество. Это поле можно разделить на три, тогда получим отношение в 1НФ: StudentID LastName 1 Казаков 2 Васильев 4 Шишкина FirstName Петр Иван Дарья MiddleName Владимирович Аркадьевич Сергеевна Следует иметь в виду, что значения полей должны быть логически неделимы, т.к. фамилия состоит из отдельных букв, но такое деление не будет иметь смысла для отношения Students. Вторая нормальная форма (2НФ). Отношение находится во 2НФ тогда и только тогда, когда оно находится в 1НФ и каждый неключевой атрибут неприводимо зависит от первичного ключа. Рассмотрим следующее отношение: StudentID LastName FirstName MiddleName Course 1 Казаков Петр Владимирович информатика 2 Васильев Иван Аркадьевич математика Score 5 4 Шишкина Дарья Васильев Иван 4 2 Сергеевна Аркадьевич математика информатика 5 3 Первичным ключом здесь будет {StudentID, Course}, тогда проанализируем ФЗ этого отношения, где детерминантом является первичный ключ, а в правой части неключевой атрибут. Рассмотрим следующую ФЗ: {StudentID, Course} → {LastName} Очевидно, что она является приводимой, т.к. фамилия зависит только от StudentID, а значит существует ФЗ: {StudentID } → {LastName}. Следовательно данное отношение не находится во 2НФ. Произведем декомпозицию исходного отношения на следующие два. Students: StudentID LastName 1 Казаков 2 Васильев 4 Шишкина FirstName Петр Иван Дарья MiddleName Владимирович Аркадьевич Сергеевна Scores: StudentID 1 2 4 2 Course информатика математика математика информатика Score 5 4 5 3 Третья нормальная форма (3НФ). Отношение находится в 3НФ тогда и только тогда, когда оно находится во 2НФ и каждый неключевой атрибут не является транзитивно зависимым от первичного ключа (это означает, что в отношении отсутствуют какие-либо взаимные зависимости). Рассмотрим следующее отношение Students: StudentID 1 2 4 LastName Казаков Васильев Шишкина FirstName MiddleName GroupID Supervisor Петр Владимирович 1 Царев С.М. Иван Аркадьевич 2 Пестов Д.Н. Дарья Сергеевна 1 Царев С.М. Так как существуют ФЗ: StudentID → GroupID и GroupID → Supervisor, то атрибут Supervisor транзитивно зависит от первичного ключа StudentID. Следовательно отношение не находится в 3НФ. Приведем отношение к 3НФ. Students: StudentID LastName 1 Казаков 2 Васильев 4 Шишкина FirstName Петр Иван Дарья MiddleName Владимирович Аркадьевич Сергеевна GroupID 1 2 1 Groups: GroupID 1 Царев С.М. 2 Пестов Д.Н. Supervisor Уточнение третьей нормальной формы – нормальная форма Бойса-Кодда При определении 3НФ было сделано допущение о том, что отношение имеет только один потенциальный ключ, который и является первичным. Если рассмотреть более общий случай, то первоначальное определение, данное Э. Коддом для ЗНФ, оказывается не во всех случаях удовлетворительным. В частности, оно неадекватно при выполнении следующих условий: 1) отношение имеет два (или больше) потенциальных ключа; 2) эти потенциальные ключи являются составными; 3) они перекрываются (т.е. имеют по крайней мере один общий атрибут). Поэтому впоследствии исходное определение ЗНФ было заменено более строгим определением Бойса-Кодда. На практике комбинация всех трёх условий встречается редко, и для отношений, в которых не выполняются все эти три условия, 3НФ и нормальная форма Бойса-Кодда полностью эквивалентны. Нормальная форма Бойса-Кодда (НФБК). Отношение находится в нормальной форме Бойса-Кодда тогда и только тогда, когда каждая ее нетривиальная и неприводимая слева функциональная зависимость имеет в качестве своего детерминанта некоторый потенциальный ключ. Рассмотрим следующее отношение: StudentID 1 2 4 CourseID 20 20 15 TeacherID 23 12 9 Каждый кортеж означает, что некоторый студент изучает определенную дисциплину у указанного преподавателя. При этом существуют следующие ограничения: 1. Каждый преподаватель ведет только одну дисциплину. 2. Одну дисциплину может вести несколько преподавателей. 3. Для некоторого студента одну дисциплину ведет только один преподаватель. В данном отношении есть два потенциальных ключа {StudentID, CourseID} и {StudentID, TeacherID}. Оба ключа являются составными и они имеют общий атрибут StudentID, т.е. перекрываются. Таким образом выполнены все три условия, которые могут привести к ситуации, когда отношение может находиться в 3НФ, но не находится в НФБК. Очевидно, что отношение находится в 3НФ: значения всех атрибутов неделимы (1НФ); каждый неключевой атрибут неприводимо зависит от первичного ключа (2НФ); все неключевые атрибуты нетранзитивно зависят от потенциального ключа (3НФ). Однако, в данном отношении существует ФЗ TeacherID → CourseID и TeacherID при этом не является потенциальным ключом, следовательно отношение не находится в НФБК. Если произвести декомпозицию этого отношения на два: {StudentID, CourseID} и {CourseID, TeacherID}, то потеряем информацию о том, какой именно преподаватель ведет дисциплину для конкретного студента. Это объясняется тем, что исходное отношение является атомарным, т.е. его нельзя разбить на две независимые проекции. Таким образом, в процессе нормализации не всегда есть смысл стремиться к атомарным отношениям, но, тем не менее, для основных объектов базы данных рекомендуется добиваться атомарности. Если отношение находится только в 1НФ, но не находится во 2НФ и 3НФ, то можно говорить об избыточности информации. Избыточность не только увеличивает объём и трудоёмкость заполнения базы данных, но и может привести к аномалиям обновления. Аномалии могут приводить к трудностям при вставке, обновлении и удалении, а главное к искажению или потере информации. Краткие итоги. Рассмотрены первая, вторая, третья нормальные формы и нормальная форма Бойса-Кодда. На примерах разобран процесс приведения отношения в заданную нормальную форму. Лекция № 11 Тема: Четвертая и пятая нормальные формы Цель: ввести понятие четвертой и пятой нормальных форм и обосновать необходимость их применения. Многозначная зависимость Пусть R – отношение, а A, B и C являются произвольными подмножествами множества атрибутов отношения R. Тогда подмножество B многозначно зависит от подмножества А, что символически выражается следующей записью А →→ В (читается как «А многозначно определяет B»), тогда и только тогда, когда в каждом допустимом значении R множество значений B, соответствующее заданной паре значений А, C, зависит только от значения А и не зависит от значения C. Рассмотрим отношение {CourseID, TeacherID, RoomID} со следующими ограничениями: 1. Любая дисциплина может вестись любым количеством преподавателей и в любом количестве кабинетов. 2. Преподаватели и кабинеты не зависят друг от друга. 3. Преподаватель может вести несколько разных дисциплин в разных кабинетах. Из этих ограничений видно, что отношение получается избыточным, т.к. если существуют следующие два кортежа: CourseID 2 2 TeacherID 10 9 RoomID 400 401 то в данном отношении обязаны существовать и следующие две записи: CourseID 2 TeacherID 9 RoomID 400 2 10 401 Таким образом, если мы хотим добавить информацию о том, что какую-то дисциплину может вести некоторый преподаватель, мы должны вставить столько записей, сколько кабинетов подходит для данной дисциплины. Кроме того, можно легко проверить, что данное отношение находится в НФБК: если отношение находится в 1НФ и оно полностью ключевое (единственный потенциальный ключ состоит из всего множества атрибутов отношения), то можно утверждать, что оно находится в НФБК. Это объясняется тем, что неключевых атрибутов нет, а, следовательно, все требования 2НФ, 3НФ и НФБК выполняются автоматически. Для нормализации отношения, нам требуется разбить его на два, но раньше мы производили декомпозицию на основе транзитивных ФЗ, здесь же все ФЗ тривиальны, т.е. все атрибуты напрямую зависят от первичного ключа. Необходимо определить способ декомпозиции данного отношения и доказать, что декомпозиция будет произведена без потерь. Правило многозначной зависимости: для отношения R, в котором существуют подмножества множества атрибутов A, B, C, А →→ B тогда и только тогда, когда А →→ С. Обычно это записывают так: А →→ B | C. Теорема Фейгина. Пусть А, B и С являются множествами атрибутов переменной отношения R{A, B, С}. В таком случае отношение R будет равно соединению его проекций по атрибутам {А, B} и {А, С} тогда и только тогда, когда для отношения R выполняется многозначная зависимость А →→ B | C. Найдем все МЗ в нашем отношении: {CourseID} → {TeacherID} {CourseID} → {RoomID} По теореме Фейгина мы можем произвести декомпозицию по этим двум МЗ и при этом никакая информация не будет потеряна. Получим два отношения: {CourseID, TeacherID} и {CourseID, RoomID}. Так как эти отношения полностью ключевые, то они находятся в НФБК. Теперь, следуя теореме Фейгина, можно дать определение четвертой нормальной формы. Четвертая нормальная форма Отношение R находится в четвертой нормальной форме (4НФ) тогда и только тогда, когда в случае существования таких подмножеств А и В атрибутов этого отношения R, для которых выполняется нетривиальная многозначная зависимость А →→ B, все атрибуты отношения R также функционально зависят от атрибута А. Можно дать альтернативную формулировку: отношение R находится в 4НФ тогда и только тогда, когда оно находится в НФБК и все многозначные зависимости в отношении R фактически представляют собой функциональные зависимости от его потенциальных ключей. Обратите внимание на то, что, исходя из этого определения, нахождение в 4НФ предполагает обязательное нахождение в НФБК. Следовательно, исходное отношение {CourseID, TeacherID, RoomID} не находится в 4НФ, т.к. существует МЗ CourseID →→ TeacherID, которая не является ФЗ, и детерминант не является ключом. Полученные две проекции {CourseID, TeacherID} и {CourseID, RoomID} будут в 4НФ, т.к. существуют только ФЗ от единственного потенциального ключа. Зависимость соединения До сих пор по умолчанию предполагалось, что единственной необходимой или допустимой операцией в процессе нормализации является замена отношения по правилам декомпозиции без потерь точно двумя ее проекциями. Однако существуют отношения, для которых нельзя выполнить декомпозицию без потерь на две проекции, но которые можно подвергнуть декомпозиции без потерь на три или большее количество проекций. Подобные отношения обозначим термином «n-декомпонуемое отношение», где n – количество проекций, на которые можно разбить без потерь. Пример. Рассмотрим пример отношения, которое трудно разбить без потерь на два отношения: Teacher Иванов С.Ю. Иванов С.Ю. Иванов С.Ю. Пестов О.А. Веснин Р.А. Course Технологии программирования Технологии программирования Базы данных Базы данных Базы данных Разобьем на три отношения: Teacher Course Group ПМ-41 ПМ-51 ПМ-41 ПМ-51 ПМ-51 Иванов С.Ю. Иванов С.Ю. Пестов О.В. Веснин Р.А. Технологии программирования Базы данных Базы данных Базы данных Course Технологии программирования Технологии программирования Базы данных Базы данных Teacher Иванов С.Ю. Иванов С.Ю. Пестов О.В. Веснин Р.А. Group ПМ-41 ПМ-51 ПМ-41 ПМ-51 Group ПМ-41 ПМ-51 ПМ-51 ПМ-51 Если произвести соединение только двух отношений, то мы получим лишние записи, которых не было в исходном отношении. Но если мы соединим все три проекции, то получим в точности исходное отношение. Поэтому можно сказать, что исходное отношение 3-декомпонуемое. Дадим определение зависимости соединения, необходимое для 5НФ. Зависимость соединения. Пусть R – отношение, а А, B, ..., Z – произвольные подмножества множества его атрибутов. Отношение R удовлетворяет зависимости соединения *{А, В, . . . , Z} (читается «звездочка А, B, ..., Z») тогда и только тогда, когда любое допустимое значение отношения R эквивалентно соединению его проекций по подмножествам А, B, ..., Z множества атрибутов. Для нашего исходного отношения существует зависимость соединения: *{ {Teacher, Course}, {Course, Group}, {Teacher, Group} }. Зависимости соединений включают в себя многозначные зависимости, а многозначные зависимости включают в себя функциональные. Пятая нормальная форма Отношение R находится в пятой нормальной форме (5НФ), которую иногда иначе называют проекционно-соединительной нормальной формой, тогда и только тогда, когда каждая нетривиальная зависимость соединения в отношении R определяется потенциальным ключом (или ключами) R. Отношение {Teacher, Course, Group} не находится в 5НФ, т.к. в отношении существует только один потенциальный ключ (первичный), то можно составить только одну зависимость соединения: *{ {Teacher, Course}, {Course, Group}, {Teacher, Group} } Эта зависимость соединения не подразумевается первичным ключом, т.е. потенциальный ключ не встречается в подмножествах этой зависимости. Рассмотрим отношение Groups: {GroupID, GroupName, Faculty, Supervisor}. Здесь два потенциальных ключа: GroupID и GroupName. Можно составить следующие зависимости соединения: *{ {GroupID, Supervisor}, {GroupID, GroupName, Faculty} } *{ {GroupID, GroupName}, {GroupID, Faculty}, {GroupName, Supervisor} } и т.д. Следует отметить, что в каждом подмножестве есть хотя бы один потенциальный ключ, и каждый потенциальный ключ встречается хотя бы один раз в этих подмножествах. Впрочем, найти в некотором отношении все зависимости соединения гораздо сложнее, чем многозначные и функциональные зависимости, поэтому процесс проверки на 5НФ недостаточно точен. Однако отношения, которые доведены до 4НФ, но не находятся в 5НФ, на практике встречаются крайне редко. Фактически 5НФ является окончательной нормальной формой по отношению к операциям проекции и соединения (что отражено в ее альтернативном названии – проекционно-соединительная нормальная форма). Таким образом, если переменная отношения находится в 5НФ, то гарантируется, что она не содержит аномалий, которые могут быть исключены посредством ее разбиения на проекции. Итоговая схема нормализации До сих пор весь процесс нормализации основывался на декомпозиции без потерь. Основная идея состояла в следующем: пусть дано некоторое отношение R в 1НФ и для него определены функциональные зависимости, многозначные зависимости и зависимости соединения. Задача заключается в систематическом разбиении исходного отношения R на такой набор меньших (т.е. имеющих меньшую степень) отношений, который в некотором смысле будет эквивалентен отношению R, но с другой стороны будет более предпочтительным. Каждый этап процесса такого преобразования заключается в разбиении на проекции отношений, полученных на предыдущем этапе. При этом на каждом этапе преобразования существующие ограничения используются для выбора тех проекций, которые будут получены в этот раз. Весь процесс нормализации можно неформально определить с помощью следующих правил: 1. Отношение в 1НФ следует разбить на такие проекции, которые позволят исключить все функциональные зависимости, не являющиеся неприводимыми. В результате будет получен набор переменных отношения во 2НФ. 2. Полученные отношения во 2НФ следует разбить на такие проекции, которые позволят исключить все существующие транзитивные функциональные зависимости. В результате будет получен набор отношений в ЗНФ. 3. Отношения в ЗНФ следует разбить на проекции, позволяющие исключить все оставшиеся функциональные зависимости, в которых детерминанты не являются потенциальными ключами. В результате будет получен набор отношений в НФБК. Заметим, что эти три правила можно объединить в одно: «Исходное отношение следует разбить на проекции, позволяющие исключить все функциональные зависимости, в которых детерминанты не являются потенциальными ключами». 4. Отношения в НФБК следует разбить на проекции, позволяющие исключить все многозначные зависимости, которые не являются также функциональными. В результате будет получен набор отношений в 4НФ. На практике такие многозначные зависимости обычно исключаются перед выполнением этапов 1–3. 5. Отношения в 4НФ следует разбить на проекции, позволяющие исключить все зависимости соединения, которые не определяются потенциальными ключами. В результате будет получен набор отношений в 5НФ. По поводу приведенных выше правил можно сделать несколько дополнительных замечаний: 1) Процесс разбиения на проекции на каждом этапе должен быть выполнен без потерь и с сохранением зависимостей (там, где это возможно). 2) Иногда удобно пользоваться альтернативными определениями нормальных форм: отношение R находится в НФБК тогда и только тогда, когда каждая функциональная зависимость определяется его потенциальными ключами; отношение R находится в 4НФ тогда и только тогда, когда каждая многозначная зависимость определяется его потенциальными ключами; отношение R находится в 5НФ тогда и только тогда, когда каждая зависимость соединения определяется его потенциальными ключами. 3) Общее назначение процесса следующем: исключение избыточности; нормализации заключается в устранение аномалий обновления; разработка проекта базы данных, который является достаточно «качественным» представлением реального мира, интуитивно понятен и может служить хорошей основой для последующего расширения; упрощение процедуры наложения ограничений целостности (эта цель обеспечивается созданием связи «один ко многим», от ключевого к неключевому). 4) Необходимо помнить, что данные рекомендации по поводу нормализации являются всего лишь рекомендациями и, вероятно, могут существовать соображения, по которым нормализацию не следует выполнять до конца или можно менять последовательность действий. 5) Идеи нормализации чрезвычайно полезны для проектирования баз данных, но они отнюдь не являются универсальным средством по следующим причинам: нормализация позволяет реализовать определенные ограничения целостности, но на практике, помимо зависимостей соединения, функциональных и многозначных зависимостей, существуют и другие типы ограничений; декомпозиция может быть неуникальной (как правило, имеется несколько способов приведения заданного отношения к 5НФ), но существует очень мало объективных критериев, позволяющих выбрать один из альтернативных вариантов декомпозиции; преследование одновременно двух целей (т.е. приведение к НФБК и сохранение зависимостей) в некоторых случаях приводит к конфликтной ситуации; не всякую избыточность данных можно устранить разбиением на проекции. Следует также отметить, что существуют хорошие методики нисходящего проектирования, которые позволяют тем или иным конкретным способом создавать полностью нормализованный проект базы данных. Другие нормальные формы Помимо уже описанных, существуют и другие нормальные формы. Дело в том, что теория нормализации (теория зависимостей) развилась в широкую самостоятельную область знаний. Исследования в данной области продолжаются и в настоящее время, причем довольно успешно, и после 5НФ были выведены некоторые другие: 1. Доменно-ключевая нормальная форма (ДКНФ). Эта форма была предложена Р. Фейгином, но в отличие от других нормальных форм, она не определяется в терминах функциональных зависимостей, многозначных зависимостей или зависимостей соединения. Вместо этого утверждается, что отношение R находится в ДКНФ тогда и только тогда, когда каждое наложенное на него ограничение является логическим следствием ограничений доменов и ограничений ключей отношения R. Здесь ограничение домена – это ограничение, предписывающее использование для определенного атрибута значений только из некоторого заданного домена. А ограничение ключа - это ограничение, утверждающее, что некоторый атрибут или комбинация атрибутов представляет собой потенциальный ключ. Несмотря на то, что Р. Фейгин доказал, что отношение в ДКНФ находится и в 5НФ, не все отношения можно привести к ДКНФ. 2. Нормальная форма типа «выборка – объединение». Такие нормальные формы связаны с другим направлением в исследовании нормализации: проведение декомпозиции не на основе проекции, а на основе других операций. В данном случае взяты операции выборки и объединения. Так, например, таблицу Students на основе выборки можно разбить на таблицы по каждой группе или по курсу. Таким образом, всегда можно создать новую теорию нормализации на основе выборки, и нормальные формы этой теории будут типа «выборка– объединение». Тогда нормальные формы, рассмотренные нами, можно назвать нормальными формами типа «проекция–соединение». Краткие итоги. Рассмотрены четвертая и пятая нормальные формы, которые считаются окончательными. Сформулированы основные правила нормализации баз данных. Приведены альтернативные нормальные формы. Лекция № 12 Тема: Использование MS SQL Server 2008 совместно с MS Visual Studio 2008 Цель: познакомить с новыми возможностями в области работы с данными. Создание функций для MS SQL Server с использованием платформы . Net Framework Данная возможность появилась еще в MS SQL Server 2005, когда стало можно подключать к MS SQL Server свои собственные сборки, созданные для платформы .Net Framework. Благодаря этому пользователи получили возможность создавать в MS Visual Studio при помощи одного из языков программирования (C#, Visual Basic.Net и др.) объекты, которые впоследствии могут использоваться внутри MS SQL Server. Разрешается создание следующих объектов: новые типы данных; пользовательские функции; хранимые процедуры; агрегатные функции; триггеры. По умолчанию на MS SQL Server запрещено использование CLR (Common Language Runtime), поэтому требуется явно включить эту опцию на сервере. Замечание. CLR – это общеязыковая исполняющая среда, которая входит в состав Microsoft .Net Framework и отвечает за выполнение любого кода, созданного для платформы .Net Framework. C# – объектно-ориентированный язык, разработанный специально для платформы .Net Framework. Однако можно использовать и другие языки программирования для данной платформы. Рассмотрим процесс создания обычной функции для MS SQL Server на языке C# в MS Visual Studio 2008. 1. В MS Visual Studio 2008 создадим новый проект (меню File – New – Project…) 2. В диалоге создания проекта выберем нужный тип проекта и укажем имя (рис. 12.1). Рис. 12.1. Создание нового проекта в MS Visual Studio 2008 3. Далее можно указать сервер и базу данных, которые впоследствии можно будет использовать для отладки кода (см. рис. 12.2). Рис. 12.2. Выбор сервера и базы данных 4. В созданный проект добавим новый объект – пользовательскую функцию (см. рис. 12.3). Рис. 12.3. Добавление функции в проект 5. Напишем следующий код в этой функции: using using using using using System; System.Data; System.Data.SqlClient; System.Data.SqlTypes; Microsoft.SqlServer.Server; public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction] public static SqlInt32 Sum(SqlInt32 a, SqlInt32 b) { return a + b; } }; Обратите внимание, что используются не обычные типы данных, которые есть в C#, а специфичные для MS SQL Server, такие типы имеют префикс «Sql» 6. Зарегистрируем сборку на сервере MS SQL Server. Для этого выполним команду меню Build – Deploy Solution. При этом будет произведена компиляция сборки, а сама сборка будет помещена на сервер в указанную БД (см. п.3.). 7. Разрешим выполнение CLR кода на сервере: sp_configure 'clr enabled', 1 RECONFIGURE; 8. После этого можно вызвать созданную функцию: SELECT dbo.Sum(10, 20) Аналогичным образом можно создать и агрегатную функцию. Например, агрегатная функция SUM в MS SQL Server работает только с числами, поэтому если возникает необходимость использовать такую функцию для строк (чтобы набор строк объединился в единую строку, а значения были бы разделены запятыми), то это можно реализовать средствами C#. Технологии доступа к данным: LINQ и ADO.NET Технология ADO.NET ADO.NET представляет собой основную модель доступа к данным в платформе .Net Framework. Она не является расширением существовавшей ранее технологии ADO, а реализует новую модель работы с данными. Например, она предполагает отсоединенную модель работы, т.е. подключение с сервером баз данных устанавливается только на момент выполнения запроса, после чего оно разрывается. Ранее подключения с БД поддерживалось на протяжении всего сеанса работы. ADO.NET включает следующие ключевые компоненты: наборы данных (DataSet). Представляют собой некоторую часть реальной БД, включая в себя не только таблицы, но и связи между таблицами и ограничения; провайдеры данных (DataProvider). Благодаря наличию различных провайдеров, технология ADO.NET может работать с различными типами СУБД: MS SQL Server, MS Access, Oracle, а также с любой БД, используя технологию ODBC (Open DataBase Connectivity). Общая схема работы с использованием ADO.NET: 1. Создать и установить подключение к серверу. подключимся к локальному серверу к БД AdventureWorks: Например, string connectionString = “Data Source=(local);Initial Catalog=AdventureWorks; Integrated Security=SSPI;”; SqlConnection connection = new SqlConnection(connectionString); connection.Open(); 2. Создать команду и выполнить на сервере. Например, получим все записи из таблицы Orders: SqlCommand cmd = new SqlCommand(“SELECT * FROM Orders”, connection); SqlDataReader reader = cmd.ExecuteReader(); 3. Обработать результаты выполнения команды. Например, выведем содержимое таблицы на консоль: while (reader.Read()) { Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1])); } reader.Close(); 4. Закрыть соединение: conn.Close(); Технология LINQ LINQ (Language Integrated Query) – проект Microsoft по добавлению синтаксиса языка запросов, напоминающего SQL, в языки программирования платформы .NET Framework. LINQ позволяет выполнять запросы к объектам находящимся в памяти, в типизированной базе данных и в XML документе. Для этого используются соответствующие технологии: LINQ, DLINQ XLINQ. Например, создадим массив arr и заполним его числами от 0 до 10, а затем при помощи LINQ выберем элементы большие 4 и меньшие 8: int[] arr = { 7, 9, 3, 4, 5, 6, 0, 8, 9, 10 }; var newArray = from i in arr where i > 4 && i < 8 select i; В результате переменная newArray будет содержать коллекцию целых чисел: 7, 5, 6. Перед началом работы LINQ с базами данных нам требуется получить описания объектов базы данных в MS Visual Studio. Существуют различные инструменты для генерации сущностей для MS Visual Studio из баз данных. Например, утилита командной строки SQLMetal, которую можно найти в папке: C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin. Пример использования: SQLMetal /server:.\SQL2008 /database:AdventureWorks /pluralize /code:AdventureWorks.cs В результате будут сгенерированы объекты на C#, описывающие все объекты БД AdventureWorks2008. Рассмотрим применение LINQ на практике. Перед выполнением запросов LINQ к базам данных необходимо создать контекст данных: var db = new MyDataContext(@"server=.\SQLEXPRESS; database=my; integrated security=SSPI"); if (!db.DatabaseExists()) db.CreateDatabase(); Рассмотрим примеры выполнения стандартных операций над данными при помощи LINQ. 1. Выборка одного единственного значения: var first = db.Customers.FirstOrDefault(c => c.CustID=="CHIPS"); 2. Выборка по условию: where, null, contains & type var r = new string[] { "WA", "OR" }; var customers = from c in db.Customers where c is Customer && (c.Region==null || r.Contains(c.Region)) select c; 3. Операция соединения таблиц: var labels = (from c in db.Customers join o in db.Orders on c.CustID equals o.CustID select new { name = c.ContactName, address = o.ShipAddress }).Distinct(); 4. Выполнение агрегатных функций: var totals = from c in db.Customers group c by c.Country into g select new Summary { Country = g.Key, CustomerCount = g.Count(), OrdCount = g.Sum(a=> a.Orders.Count)}; 5. Операция вставки новой записи: var customer = new Customer() { CustID = "CHIPS", CompanyName = "Mr. Chips" }; db.Customers.InsertOnSubmit(customer); db.SubmitChanges(); Краткие итоги. Рассмотрены новые технологии работы с данными: LINQ и ADO.NET. Продемонстрированы новые возможности MS SQL Server – исполнять функции и использовать новые типы данных, созданные в MS Visual Studio для платформы .Net Framework. Лекция № 13 Тема: Серверная часть систем. Клиентская часть системы. Серверная часть системы MS SQL Server реализуется в виде нескольких самостоятельных служб, каждая из которых отвечает за выполнение определенных задач. Служба SQL Server (MSSQLServer) является ядром этой СУБД, от ее функционирования зависят все остальные службы. Выполняет следующие основные функции: o распределяет ресурсы компьютера между пользователями, одновременно работающими с системой; o управляет файлами баз данных и журналами транзакций; o выполняет команды языка Transact-SQL (рассматривается в лекции 3), запросы и хранимые процедуры (рассматриваются в лекциях 4 и 5 соответственно), указываемые пользователями; o обеспечивает безопасность системы (например, осуществляет проверку учетных записей пользователей; система безопасности рассматривается в лекции 6); o отвечает за согласованность и целостность данных, предотвращая логические проблемы. Замечание. Если данная служба не запущена, то никакие пользователи не могут подключиться к серверу и никакие административные задачи не могут быть выполнены! Служба SQL Server Agent отвечает за автоматическое исполнение назначенных администратором заданий, выполняет отслеживание определенных событий и сопоставленных им заданий (например, создание резервных копий, отправка сообщения администратору о возникшей проблеме и т.п.). Служба Full-Text Filter Daemon позволяет реализовать поиск символьной информации в полях таблиц баз данных. С помощью этой службы осуществляется поиск слов и фраз, причем в результате могут быть отражены склоняемые формы глаголов и существительных. Служба Integration Services заменяет службу DTS SQL Server 2000 и позволяет выполнять следующее: o отслеживать выполнение всех пакетов служб Integration Services, выполняющихся на компьютере; o отображать в иерархическом виде пакеты и папки служб Integration Services, которые физически хранятся в разных местах. Служба Analysis Services – ядро сервера OLAP10, позволяет создавать аналитические приложения с миллионами строк данных и тысячами пользователей. Служба Reporting Services – эта служба представляет серверный компонент, который отвечает за генерацию отчетов, предоставление их пользователям, выполнение различных служебных операций с отчетами. Служба SQL Server Browser предназначена для формирования списка доступных в сети SQL-серверов. Клиентская часть системы MS SQL Server поддерживает множество различных типов клиентов, каждый из которых может работать на своей аппаратной и программной платформе. В комплект поставки MS SQL Server входят стандартные утилиты, которые могут использоваться для управления работой сервера и создания логической структуры баз данных, поддерживаемых им. Для разработки клиентского приложения могут быть использованы и различные средства разработки приложений, например, среды визуального программирования Visual Studio .Net 2003-2008, Visual Basic, Delphi и др. К стандартным утилитам администрирования относятся следующие приложения. SQL Server Configuration Manager Предоставляет следующие возможности: по управлению работой всех служб MS SQL Server, рассмотренных выше. Можно запустить, приостановить или полностью остановить любую из описанных выше служб, а также указать, от имени какого пользователя ее следует запускать. По определению параметров сетевых библиотек, которые обеспечивают взаимодействие с MS SQL Server. Можно выбрать один или сразу несколько методов доступа к серверу: o именованные каналы (Named Pipes) – технология похожа на использование сокетов, применяется в случае недоступности протоколов TCP/IP; o стек протоколов TCP/IP (используется по умолчанию) – подходит для использования через сеть Интернет; o разделяемая память (Shared Memory) – подходит для локального использования, например, веб-приложение и MS SQL Server находятся на одном компьютере. Обеспечивает максимальную скорость работу; 10 OLAP – On-Line Analytical Processing – оперативная аналитическая обработка. o виртуальный интерфейсный адаптер (Virtual Interface Adapter, VIA) – используется для подключений типа сервер-сервер с применением специализированного оборудования. По конфигурированию сетевых библиотек клиента, используемых для доступа к MS SQL Server. После настройки методов доступа к серверу, можно произвести конфигурацию клиентских протоколов. Узел SQL Native Client 10.0 Configuration содержит два раздела: Client protocols и Aliases (рис. 2.1). Рис. 2.1. Окно утилиты SQL Server Configuration Manager Начиная с MS SQL Server 2000, появилась возможность подключения к серверу при помощи нескольких протоколов, например, сначала пытаемся подключиться через Shared Memory, если не получилось, то через TCP/IP, и в последнюю очередь через Named Pipes. Для определения порядка использования протоколов используется свойство Order. Узел Aliases позволяет создавать псевдонимы для подключения к серверу. Псевдоним (Alias) – это альтернативное имя соединения, которое может отличаться от имени сервера. При создании псевдонима можно выбрать протокол и порт, через которые следует подключаться к серверу. SQL Server Management Studio Утилита Management Studio позволяет выполнять следующее: управлять настройками MS SQL Server; конфигурировать систему безопасности: управление ролями, учетными записями, удаленными серверами; работать со структурой баз данных: создавать, редактировать и удалять БД и элементы БД; управлять выполнением заданий по расписанию; показывать текущую активность: текущие пользователи, какие объекты заблокированы, информацию о производительности. Перед началом работы с сервером необходимо подключиться к нему, указав следующую информацию: Server Type. Здесь следует выбрать, к какой именно службе необходимо подключится: Database Engine, Analysis Services, Report Server или Integration Services. SQL Server. Позволяет указать, к какому серверу будет осуществляться подключение. По умолчанию имя SQL Server совпадает с именем компьютера. Authentication Type – способ аутентификации, можно выбрать Windows Authentication или SQL Server Authentication. Способ Windows Authentication использует учетную запись, под которой текущий пользователь осуществил вход в Windows (рис. 2.2). SQL Server Authentication использует свою собственную систему безопасности. Рис. 2.2. Окно соединения с SQL-сервером Редактор запросов (Query Editor) Для того чтобы написать новый запрос к базе данных, необходимо выполнить команду New Query, расположенную на панели инструментов Management Studio. В результате откроется новая вкладка, в которой можно писать SQL-код (см. рис. 2.3). Выполним следующий запрос (язык написания запросов будет освещен в лекциях 3 и 4): SELECT * FROM INFORMATION_SCHEMA.TABLES; Замечание: Для выполнения запроса необходимо выполнить команду Query – Execute (F5). Чтобы просто проверить правильность синтаксической записи можно воспользоваться командой Query – Parse (Ctrl+F5), при этом сам запрос не будет выполнен. Рис. 2.3. Главное окно приложения Management Studio с окном Редактора запросов Теперь будет доступно следующее: заголовок, в котором указывается логическое имя сервера, текущая база данных и имя пользователя, установившего соединение; область запроса, используемая для ввода запросов, передаваемых MS SQL Server; область результатов, в которой отображаются результаты выполнения запроса. Способы отображения результатов могут быть следующими: o Results in Text – результаты выводятся в виде обычного текста. o Results in Grid – результат выводится в виде таблицы, в которой можно изменять ширину столбцов, выделять нужные ячейки/строки/столбцы. o Results to File – аналогично Results in Text, только вывод осуществляется не на экран, а в файл. Management Studio позволяет открывать несколько окон запросов и работать с несколькими базами данных одновременно. В каждом окне устанавливается собственное соединение с MS SQL Server, которое описано в SQL Server Configuration Manager, на основе различных учетных записей пользователей и их паролей. Для создания нового подключения используется команда File – New – Database Engine Query. Содержимое области запроса текущего подключения может быть сохранено в файле на внешнем носителе командой File – Save. Object Explorer Позволяет осуществлять навигацию по базе данных: просматривать доступные объекты, выполнять запросы на просмотр содержимого таблиц, создавать скрипты для объектов и т.д. (рис. 2.4). Рис. 2.4. Панель Object Explorer Выпадающий список баз данных База данных, выбранная в этом списке, используется в редакторе запросов как база данных по умолчанию (см. рис. 2.5). Поэтому важно перед выполнением запросов, убедиться, что выбрана нужная БД. Это можно сделать либо через выпадающий список, либо при помощи команды SQL: USE AdventureWorks2008 Рис. 2.5. Окно выбора текущей базы данных Reporting Services Configuration Используется для конфигурации служб отчетов. MS SQL Server 2008 включает в себя встроенный web-сервер, поэтому нет необходимости в установке и настройке служб интернет-серверов IIS (Internet Information Services). Для создания отчетов используется Report Definition Language (RDL) – язык, основанный на XML11. Bulk Copy Program Утилита командной строки, предназначенная для переноса форматированных данных большого объема в MS SQL Server или из него. Например, отформатированные данные могут быть автоматически перенесены из обычного текстового файла в таблицу MS SQL Server. SQL Server Profiler Позволяет в реальном времени отслеживать выполнение всех команд. Профайлер может находить «узкие» места в базе данных, определять запросы, которые долго выполняются, и наиболее часто выполняемые запросы. XML (eXtensible Markup Language – расширяемый язык разметки) – текстовый формат, предназначенный для хранения структурированных данных. 11 Утилита sqlcmd Утилита командной строки, которая позволяет выполнять SQL-скрипты. Данная утилита может оказаться намного эффективнее, чем Management Studio, когда не требуется графический пользовательский интерфейс. SQL Server Integration Services (SSIS) Позволяет легко извлекать данные из любых источников через механизм OLE DB12 или провайдеров данных .NET и помещать их в таблицы MS SQL Server. Во время переноса данных к ним может быть применена трансформация. SQL Server Business Intelligence Development Studio Представляет особую версию Visual Studio и позволяет создавать пакеты для Integration Services, отчеты для Reporting Services и работать с проектами Analysis Services. Лекция № 14 Тема: Переменные в Transact-SQL. Переменные в Transact-SQL Любой объект базы данных должен обладать уникальным именем внутри этой базы. На основе имени происходит обращение к этому объекту. Имена объектов называются идентификаторами. Transact-SQL накладывает ряд ограничений на порядок именования объектов: первый символ имени должен быть одним из символов латинского алфавита (A-Z, a-z), либо символом @, # или _, т.е. не допускается использование цифр и прочих специальных символов. Остальная часть имени может включать любые символы алфавита, цифры и некоторые специальные символы; общая длина имени обычного объекта не должна превышать 128 символов, для временных объектов – 116; внутри имени запрещается использование пробелов, скобок и таких символов, как ~, !, %, ^, & и др. имя объекта не должно совпадать с зарезервированным словом и с именем уже существующего объекта; если имя объекта содержит пробелы или совпадает с зарезервированным словом, то его необходимо поместить внутрь квадратных скобок [ ]. 12 OLE DB (Object Linking and Embedding, Database – внедрение и связывание объектов в базах данных) – набор интерфейсов, которые позволяют приложениям обращаться к данным из различных источников. Замечание: Transact-SQL является CASE-нечувствительным языком, т.е. не различает регистра символов. Имена локальных переменных должны удовлетворять перечисленным правилам именования объектов и всегда должны начинаться с символа @. Область действия переменной ограничена пакетом операторов или процедурой, в которой она была объявлена. Объявление переменной Синтаксис команды (внутри квадратных скобок в описании синтаксиса располагаются необязательные элементы): DECLARE @ИмяПеременной ТипДанных [ ,…n] Пример объявления одной переменной: DECLARE @sum int Пример объявления нескольких переменных: DECLARE @temp int, @count float Присвоение значения Синтаксис команды: SET @ИмяПеременной = Выражение Пример присвоения значения: SET @sum = 0 В версии MS SQL Server 2008 появились следующие нововведения. Инициализировать переменную стало можно сразу при объявлении, например: DECLARE @iCounter int = 0 Появились операторы +=, –=, *=, /= для краткой формы записи арифметических конструкций. Управляющие конструкции Transact-SQL Группировка команд Группировка двух и более команд в единый блок осуществляется с помощью конструкции: BEGIN ... END Такая группировка конструкциях. используется в условных и циклических Конструкция ветвления Выполнение той или иной группы команд в зависимости от выполнения или не выполнения некоторого условия реализуется с помощью конструкции: IF <условие> Оператор [ELSE Оператор ] При отсутствии команд, выполняемых при несоблюдении условия, ключевое слово ELSE можно не указывать. Следует отметить особенность проверки значений на NULL (специальный маркер, обозначающий отсутствие информации). Вместо обычного сравнения: IF @myvar = NULL, следует использовать оператор IS: IF @myvar IS NULL. Конструкция CASE Аналогична оператору CASE в языках программирования. В MS SQL Server 2008 оператор CASE имеет два возможных варианта использования. 3. С входным выражением: CASE <входное выражение> WHEN <выражение when > THEN <результат> [...] [ELSE <результат>] END Пример: SELECT TOP 10 SalesOrderID, SalesOrderID % 10 AS ‘Last Digit’, Position = CASE SalesOrderID % 10 WHEN 1 THEN ‘Один’ WHEN 2 THEN ‘Два’ WHEN 3 THEN ‘Три’ WHEN 4 THEN ‘Четыре’ ELSE ‘Другое’ END FROM Sales.SalesOrderHeader; Результат запроса представлен на рис. 3.1. Рис. 3.1. Результат использования оператора CASE 4. Без входного выражения: CASE WHEN <логическое выражение> THEN <результат> [...] [ELSE <результат>] END Используется, как правило, для поиска. Пример: SELECT TOP 10 SalesOrderID % 10 AS 'OrderLastDigit', ProductID % 10 AS 'ProductLastDigit', "How Close?" = CASE WHEN (SalesOrderID % 10) < 3 THEN 'Меньше трёх' WHEN ProductID = 6 THEN 'ProductID равен 6' WHEN ABS(SalesOrderID % 10 - ProductID) <= 1 THEN ' В пределах одного' ELSE 'Больше одного' END FROM Sales.SalesOrderDetail ORDER BY SalesOrderID DESC; Результат выполнения запроса представлен на рис. 3.2. Рис. 3.2. Результат использования оператора CASE Циклическая конструкция Transact-SQL поддерживает единственный тип цикла – цикл WHILE, синтаксис которого следующий: WHILE условие Оператор [BREAK | CONTINUE] Замечание. Вертикальная черта в описании синтаксиса означает «или», т.е. в данном примере может быть указан либо BREAK, либо CONTINUE. Тело цикла выполняется до тех пор, пока условие истинно. Цикл можно принудительно остановить, если выполнить в теле цикла команду BREAK. Если же нужно начать цикл заново, не дожидаясь выполнения команд тела цикла, необходимо выполнить команду CONTINUE. Конструкция WAITFOR В некоторых случаях требуется отложить выполнение той или иной команды. Для этих целей можно воспользоваться оператором WAITFOR. Эта команда имеет следующий синтаксис: WAITFOR DELAY <’time’> | TIME <’time’> Если используется параметр DELAY, то указывается, сколько времени необходимо ждать MS SQL Server. Максимально возможная задержка – 24 часа. Пример использования: WAITFOR DELAY ‘01:00’, который приостановит выполнение на один час. Если используется параметр TIME, то исполнение будет приостановлено до наступления заданного времени. Пример использования: WAITFOR TIME ‘01:00’ – приостановление выполнения кода до наступления часа ночи. Блок TRY/CATCH Данную конструкцию можно использовать для обработки исключительных ситуаций. Впервые это конструкция появилась в MS SQL Server 2005. Блок TRY/CATCH в MS SQL Server работает также как и в других языках программирования. Используется следующий синтаксис: BEGIN TRY { <выражения SQL> } END TRY BEGIN CATCH { <выражения SQL> } END CATCH [ ; ] В блоке BEGIN TRY... END TRY выполняются потенциально опасные команды, если при этом произойдет ошибка уровня 11-19, то выполнение будет передано в блок CATCH. Уровни ошибок: 1–10 Информационные сообщения. Например, обнаружение NULL значений при выполнении агрегатных функций. Так как управление в блок CATCH данные ошибки не передают, то для получения информации об ошибки можно использовать функцию @@ERROR. 11–19 Относительно серьезные ошибки. Например, нарушение ограничений внешнего ключа. 20–25 Очень серьезные ошибки. Это ошибки на уровне системы, поэтому в коде нельзя узнать о ее возникновении. Такие ошибки разрывают текущее соединение и прерывают выполнение команд. Лекция № 15 Тема: Простая выборка данных. Выборка данных из нескольких таблиц. Простая выборка данных Для простой выборки данных используется сокращенный синтаксис оператора SELECT: SELECT [ALL | DISTINCT] [TOP n [PERCENT] СписокВыборки FROM ИмяТаблицы WHERE УсловиеОтбора СписокВыборки определяет поля, включаемые в итоговый набор данных, ИмяТаблицы указывает таблицу БД, из которой возвращаются записи, а УсловиеОтбора позволяется ограничить число возвращаемых записей с помощью логических операторов. По умолчанию команда SELECT возвращает все записи, включая дубликаты, что определяется ключевым словом ALL, которое может быть опущено. Для получения набора уникальных неповторяющихся записей необходимо указывать ключевое слово DISTINCT. Использование ключевого слова TOP предписывает выводить не все записи итогового набора, а только n первых. Можно выбирать не фиксированное количество записей, а определенный процент от всех строк – для этого указывается ключевое слово PERCENT. Список выборки Список выборки может содержать включать следующие один или несколько элементов: * | ИмяПоля | Выражение [AS Псевдоним], [...n]. Для выборки всех полей из таблицы в списке выборки необходимо указать звездочку (*). Ключевое слово AS позволяет заменить в итоговом наборе данных обычные имена полей псевдонимами. Имя псевдонима должно удовлетворять стандартным правилам именования объектов. При необходимости включить недопустимые символы, пробелы или национальные алфавиты, имя псевдонима заключается в квадратные скобки. Например, для получения списка стран с указанием их кода и последней даты изменения записи из таблицы CountryRegion базы данных AdventureWorks2008 необходимо выбрать поля CountryRegionCode, Name, ModifiedDate: SELECT CountryRegionCode AS 'Код', [Name] AS 'Страна', ModifiedDate AS 'Дата изменения' FROM Person.CountryRegion При этом БД AdventureWorks должна быть текущей. Обратите внимание, что перед названием таблицы используется еще название схемы Person, предназначенной для управления объектами, связанными с работниками и департаментами. Поля данных будут представлены пользователю в порядке, определенном в списке выборки. Элемент Выражение задает выражение, которое включается в итоговый набор данных. Выражение может содержать константы, имена полей, функции и их комбинации. По умолчанию имя колонки с выражением не определено, поэтому можно указать псевдоним. Например, список сотрудников с указанием фамилии и первого символа имени и идентификационного номера может быть получен в результате запроса: SELECT LastName+’ ‘+Substring(FirstName,1,1)+’.’ AS [Сотрудник], ContactID FROM Person.Contact Удобочитаемость получаемого набора данных может быть повышена путем его сортировки в возрастающем или убывающем порядке. Сортировка возможна по имени поля (даже если оно и не указано в списке выборки), по псевдониму или по позиции в списке выборки, которые указываются в разделе ORDER BY ИмяПоля [,…n] [ASC | DESC]. По умолчанию сортировка осуществляется по возрастанию, что соответствует зарезервированному слову ASC, которое может опускаться, для сортировки в убывающем порядке указывается – DESC. Для отображения, рассмотренного ранее, списка сотрудников упорядоченного в алфавитном порядке необходимо дополнить запрос: SELECT LastName+’ ‘+Substring(FirstName,1,1)+’.’ AS [Сотрудник], ContactID FROM Person.Contact ORDER BY [Сотрудник] Условие отбора Условие отбора определяет критерий отбора записей, включаемых в итоговый набор. В результат будут включены только те строки, которые соответствуют наложенным условиям. Условие может включать выражения, образованные с помощью операторов сравнения или логических операторов. Условия могут также объединяться и с помощью логических операндов AND, OR и NOT. Например, чтобы получить список товаров, цена которых находится в диапазоне от $12 до $20, необходимо выполнить следующий запрос: SELECT [Name], ListPrice FROM Production.Product WHERE (ListPrice>=12) and (ListPrice<=20) ORDER by 2 Эти два оператора сравнения могут быть заменены одним логическим оператором BETWEEN, с помощью которого можно получить ответ на вопрос, лежит ли величина в указанном диапазоне. SELECT [Name], ListPrice FROM Production.Product WHERE ListPrice BETWEEN 12 and 20 ORDER BY ListPrice Данный оператор предназначен лишь для того, чтобы облегчить логику восприятия алгоритма. Для поиска по шаблону символьных строк используется логический оператор LIKE, который чаще всего используется в ситуациях, когда неизвестно точное совпадение. В шаблоне могут использоваться следующие универсальные символы: % – подразумевает любую строку, состоящую из 0 и более символов; _ – ровно один символ; [ ] – любой символ из заданного множества (например, [adfh]) или диапазона (например, [0-9]), [^] – любой символ, не попадающий в заданный диапазон или множество. Например, чтобы вывести имена сотрудников и их должностей, проживающих за пределами США, необходимо выполнить запрос: SELECT LastName, JobTitle FROM HumanResources.vEmployee WHERE CountryRegionName Not LIKE ‘%United States%’ Для определения соответствия выражения одному из перечисленных в заданном списке значений применяется логический оператор IN. Данный оператор всегда может быть записан и в виде группы условий, объединенных операндом OR. Например, с помощью следующего запроса может быть получен список сотрудников из США и Канады: SELECT LastName, JobTitle FROM HumanResources.vEmployee WHERE CountryRegionName IN (‘United States’, ‘Canada’) Однако в список значений нельзя включать неопределенное значение NULL, для работы с такими значениями используется функция выборки IS NULL. Например, следующий запрос возвращает список товаров, у которых не указан цвет: SELECT [Name] FROM Production.Product WHERE Color IS NULL Выборка данных из нескольких таблиц Такая выборка данных предполагает соединение нескольких таблиц для получения единого набора результатов, включающих записи и поля каждой таблицы. Соединение позволяет собрать данные, разделенные в процессе нормализации. Существует три вида соединений: внутреннее, внешнее и перекрестное. Для объединения трех и более таблиц можно применять последовательность соединений. Для соединения таблиц необходимо раздел FROM дополнить ключевыми словами JOIN, которое определяет соединяемые таблицы и метод соединения, и ON, указывающее общие для таблиц поля. Внутреннее соединение При таком виде соединения сравниваются значения общих полей двух таблиц, возвращаются только записи, удовлетворяющие критерию связывания в обеих таблицах. Записи, для которых не имеется пары в связанной таблице, в результат не включаются. Например, в таблице Product нормализованной базы данных AdventureWorks храниться только идентификатор категории товара. Чтобы получить список товаров с указанием их категорий, необходимо соединить таблицы Product и ProductSubcategory: SELECT Product.Name, ProductSubcategory.Name, Product.ListPrice FROM Production.Product INNER JOIN Production.ProductSubcategory ON Product.ProductSubcategoryID = ProductSubcategory.ProductSubcategoryID При таком соединении товары, для которых не указана их категория, не включаются в набор результатов. Обратите внимание, что в разделе FROM необходимо указать имя схемы Production, а в остальных случаях перед указанием поля используется имя таблицы Product и ProductSubcategory для разрешения конфликтов, т.к. в обеих таблицах присутствуют поля Name. Внешнее соединение Такое соединение также возвращает объединенные записи, соответствующие условию объединения. Однако левые и правые соединения возвращают записи и не соответствующие указанному условию объединения. Такие соединения применяются для получения полного набора записей одной из таблиц. При левом соединении в результат будут включены все записи левой таблицы (имя которой расположено слева от JOIN), независимо от того, есть для них соответствующая запись в правой таблице (имя таблицы расположено справа от JOIN) или нет. Например, следующий запрос возвращает имя контактного лица и дату размещения заказа: SELECT FirstName, LastName, OrderDate FROM Person.Contact LEFT JOIN Sales.SalesOrderHeader ON Contact.ContactID = SalesOrderHeader.ContactID Для лиц, не размещавших заказы, в поле OrderDate содержится значение NULL. При правом соединении (ключевое слово RIGHT JOIN) в результат включаются все записи правой таблицы, независимо от того, есть для них соответствующая строка в левой таблице. Измените рассмотренный запрос так, чтобы он выдавал такие же результаты при использовании правого соединения. Перекрестные соединения При таком соединении выводятся все комбинации записей таблиц, при этом не требуется указание совпадающих значений полей, поэтому условие ON опускается. В нормализованных базах данных перекрестные соединения чаще всего используются для получения списка всех возможных комбинаций записей двух таблиц, т.е. число записей итогового набора равняется произведения числа записей первой таблицы на число записей второй. Например, с помощью перекрестного соединения можно перечислить все возможные способы поставки товаров в базе данных Northwind (поставлялась с MS SQL Server до появления AdventureWorks): SELECT DISTINCT Suppliers.Country, Orders.ShipCountry FROM Suppliers CROSS JOIN Orders Объединение нескольких наборов результатов Оператор UNION объединяет результаты двух и более операторов SELECT и применяется в случае, когда данные нельзя получить при помощи одного запроса. Для получения единого итогового набора данных необходимо написать отдельные операторы SELECT и объединить их при помощи оператора UNION, при этом, в отличие от соединения, записи в итоговый набор добавляются друг за другом: SELECT ... UNION [ALL] SELECT ... [,...] По умолчанию повторяющиеся записи удаляются, для получения всех записей необходимо указать ключевое слово ALL. Необходимо также учитывать, что список полей, порядок и все их свойства должны быть одинаковы во всех используемых запросах. Имена полей итогового набора берутся из первого запроса, поэтому создание псевдонимов полей выполняется в нем. Для получения отсортированного набора данных раздел ORDER BY указывается после последнего оператора SELECT. 3. ЛАБОРАТОРНЫЕ ЗАНЯТИЯ Лабораторная работа № 1 Тема:научить правильно конфигурировать Microsoft SQL Server 2008 как на стороне сервера, так и на стороне клиента. Теоретический материал: перед выполнением лабораторной работы рекомендуется изучить лекцию №1 «Введение в теорию баз данных», в которой раскрываются основные понятия баз данных, и лекцию №2 «Компоненты Microsoft SQL Server 2008», где подробно рассмотрены все основные компоненты MS SQL Server 2008, которые будут конфигурироваться в ходе данной лабораторной работы. Требования к отчету: в процессе выполнения лабораторной работы требуется составлять отчет. Информация, необходимая для отчета, будет указана в работе словами «Запишите в отчет…». Задание 1. Изучите утилиту SQL Server Configuration. Указания к выполнению: 1. На сервере запустите утилиту SQL Server Configuration Manager и с ее помощью определите список запущенных на сервере служб. Запишите этот список в отчет. Замечание. Дополнительные возможности по управлению работой служб предоставляет утилита администрирования Windows XP Services, доступ к которой осуществляется с помощью папки Панель управления – Administrative Tools. 2. На сервере с установленным MS SQL Server 2008 с помощью утилиты Services определите параметры запуска служб MS SQL Server и запишите их в отчет. (Если нет доступа к утилите Services, то при помощи SQL Server Configuration Manager). 3. Определите, с помощью каких сетевых библиотек может быть установлено соединение с MS SQL Server (см. рис. 1.1). Какие библиотеки являются активными в данный момент? Запишите эту информацию в отчет. Рис. 1.1. Протоколы на стороне сервера, через которые к нему можно подключаться 4. При помощи SQL Server Configuration Manager определите, на основе каких сетевых библиотек клиент может подключаться к MS SQL Server (см. рис. 1.2). Запишите список библиотек в отчет. Рис. 1.2. Протоколы на стороне клиента, через которые он может подключаться к серверу Задание 2. подключений. Создание псевдонима сервера для клиентских Перед началом работы с сервером необходимо настроить параметры подключения. Для этого требуется в утилите SQL Server Configuration Manager в узле SQL Native Client Configuration – Client Protocols добавить конфигурацию сетевой библиотеки, затем указать логическое имя сервера, выбрать из списка необходимую библиотеку и определить ее параметры. Например, при взаимодействии на основе стека TCP/IP требуется указать имя узла сети, на котором установлен MS SQL Server, и номер TCP-порта, используемого при подключении (см. рис. 1.3). Рис. 1.3. Свойства протокола TCP/IP Указания к выполнению: 1. Определите и запишите в отчет сетевое имя компьютера, на котором установлен MS SQL Server. 2. В контекстном меню (правая кнопка мыши) для узла SQL Native Client Configuration – Aliases выполните команду New alias… Установите Alias Name в MyServ, выберите протокол TCP/IP, в поле Server укажите определенное ранее имя. 3. Какой номер порта должен быть указан при настройке данного соединения и почему? Запишите в отчет. Задание 3. Установите соединение с SQL сервером. Указания к выполнению: 1. На рабочей станции – клиентском компьютере13 – запустите SQL Server Management Studio и выберите из списка логическое имя сервера MyServ, определенное в предыдущем задании с помощью утилиты SQL Server Configuration Manager. Если нужного сервера нет в списке, то можно выбрать <Browse for more…> и найти требуемый сервер в списке серверов, к которым может быть выполнено подключение. 2. Подключитесь к серверу MyServ с использованием средств аутентификации MS SQL Server: учетная запись «sa», пароль отсутствует. 3. Для того чтобы написать новый запрос необходимо выполнить команду New Query расположенную на панели инструментов SQL Server Management Studio. В результате откроется новая вкладка, которая предоставляет следующие возможности: - заголовок, в котором указывается логическое имя сервера, текущая база данных и имя пользователя, установившего соединение; - область запроса, используемая для ввода запросов, передаваемых MS SQL Server; - область результатов, в которой отображаются результаты выполнения запроса, а способ отображения задается кнопками Messages (в виде текста) и Results (в виде таблицы) соответственно. 4. С помощью команды SELECT @@version определите и запищите в отчет информацию об используемой версии MS SQL Server и операционной системы (результат запроса должен быть отображен в текстовом виде) (рис. 1.4). Рис. 1.4. Сведения о версии MS SQL Server Примечание: Для выполнения запроса необходимо выполнить команду Query – Execute (F5), а для анализа правильности его синтаксической записи можно воспользоваться командой Query – Parse (Ctrl+F5). SQL Server Management Studio позволяет открывать несколько окон запросов и работать с несколькими базами данных одновременно. В каждом окне устанавливается собственное соединение с MS SQL Server на основе различных учетных записей пользователей и их паролей. Для создания нового подключения используется команда File – New – Database Engine Query. Содержимое области запроса текущего подключения может быть сохранено в файле на внешнем носителе командой File – Save. Если серверная и клиентская части MS SQL Server 2008 установлены на одном компьютере, то понятия «сервер» и «клиентский компьютер» в дальнейшем совпадают. 13 5. При помощи панели Object Explorer определите имена поддерживаемых баз данных и какие базы данных сервера являются системными (для этого нужно развернуть узел Databases в панели Object Explorer). Запишите эту информацию в отчет. Задание 4. Изучите параметры конфигурации MS SQL Server. Конфигурирование службы MSSQLServer может быть выполнено либо специальной хранимой процедурой, выполняемой в утилите SQL Server Management Studio, либо графическим способом средствами этой же утилиты. Выбор способа не имеет значения, т.к. графический способ осуществляет доступ к системным данным с помощью этой же хранимой процедуры, только в более наглядной форме. Указания к выполнению: 1. Для изменения параметров службы с помощью SQL Server Management Studio необходимо выбрать нужный сервер в Object Explorer и в контекстном меню выбрать команду Properties. В появившемся диалоговом окне можно выполнить настройку всех необходимых параметров. 2. Отобразите список параметров сервера MyServ (см. рис. 1.5). Рис. 1.5. Свойства MS SQL Server 2008 На вкладке General отображаются основные сведения о системе: версия операционной системы, объем памяти, количество процессоров и др., а также параметры запуска служб сервера. Вкладка Memory позволяет управлять выделением памяти для выполнения действий MS SQL Server: либо динамическое управление памятью, либо установить фиксированный размер. С помощью вкладки Security определяется тип аутентификации пользователей, также определяются параметры аудита доступа к серверу. Можно настроить сервер на использование определенной учетной записи, под которой будет запускаться служба MSSQLServer. Вкладка Connections позволяет конфигурировать подключения клиентские подключения к серверу. Максимальное количество пользователей, которые могут одновременно подключиться к серверу. Если указано нулевое значение, то их количество составляет 32767. Вкладка Advanced содержит некоторые общие установки сервера. Например, определяется язык по умолчанию для сообщений сервера или регулируется поддержка 2000 года, которая определяет, как будут интерпретироваться две последние цифры года. С помощью вкладки Database Settings указываются настройки вновь создаваемых баз данных: параметры индексов и работы с устройствами резервного копирования, время восстановления базы данных. 3. Определите и запишите в отчет корневой каталог сервера, количество процессоров в системе, тип аутентификации пользователей и максимальное количество пользователей, поддерживаемых сервером. 4. Изучите остальные свойства MS SQL Server, доступные в этом диалоге. Лабораторная работа № 2 Тема:Введение в Transact-SQL Цель: изучить основные операторы и алгоритмические конструкции Transact-SQL. Теоретический материал: перед выполнением лабораторной работы рекомендуется изучить лекцию №3 «Общие сведения о Transact-SQL», поскольку в ней представлено общее описание и назначение языка SQL, а также рассмотрены все алгоритмические конструкции, доступные в SQL. Требования к отчету: по результатам работы нужно представить набор SQL-скриптов, решающих задачи из раздела «Самостоятельная работа». Задание 1. Подключитесь к серверу MyServ с помощью утилиты Management Studio. Указания к выполнению: 1. Запустите SQL Server Management Studio через меню Пуск – Программы – Microsoft SQL Server 2008. 2. Выберите тип аутентификации: SQL Server Authentication. Укажите User name: sa, и Password: пустой и нажмите кнопку Connect. Задание 2. Определить, имеет ли пользователь право выборки из таблицы Product. Указания к выполнению: 1. Установите текущей базой данных AdventureWorks2008. Это можно сделать одним из следующих способов: выполните команду USE AdventureWorks2008; выберите в выпадающем списке AdventureWorks2008 (см. рис. 2.1). Рис. 2.1. Выбор текущей базы данных 2. При помощи функции object_id получим идентификатор таблицы Product. 3. Функция Permissions возвращает 32-битовую маску, в которой каждый бит означает право текущего пользователя на определенное действие. При этом значение бита зависит от параметров, с которыми была вызвана функция. Функция Permissions может быть вызвана одним из трех способов: без параметров – возвращает список разрешенных действий пользователя, которые он может выполнять в текущей БД; с одним параметром obect_id – возвращает список допустимых действий над объектом, например, над таблицей; с двумя параметрами: object_id и атрибут – возвращает разрешенные действия над атрибутом. В таблице приведен список разрешенных действий в соответствии с разными способами вызова функции Permissions. Для каждого действия указан номер и десятичное значение соответствующего бита. Номер бита 0 Бит (в десятичном виде) 1 1 2 2 4 3 4 5 6 8 16 32 64 7 8 12 13 14 128 256 4096 8192 16384 Разрешенное действие Без параметров Object_id CREATE DATABASE CREATE TABLE CREATE PROCEDURE CREATE VIEW CREATE RULE CREATE DEFAULT BACKUP DATABASE BACKUP LOG Зарезервировано SELECT ALL UPDATE ALL REFERENCES ALL INSERT DELECT EXECUTE Object_id и атрибут SELECT UPDATE REFERENCES SELECT ANY UPDATE ANY REFERENCES ANY В данном случае нас интересует младший (нулевой) бит – право на SELECT ALL. 4. Пример вызова функции Permissions (рис. 2.2): SELECT Permissions (object_id('production.product')) Рис. 2.2. Результат функции Permissions 5. Для определения того, задан ли интересующий нас бит, можно использовать битовую операцию «И» (&), тогда конечный вариант будет выглядеть следующим образом: IF Permissions (object_id('production.product'))&1=1 SELECT 'Есть право выборки' ELSE SELECT 'Права выборки нет' Рис. 2.3. Результат функции Permissions для вывода текстового описания 6. Вместо оператора SELECT можно воспользоваться оператором PRINT, который просто позволяет выводить данные в виде текста, а не в виде таблицы, как это делает SELECT. Тогда код будет выглядеть так: IF Permissions (object_id('production.product'))&1=1 PRINT 'Есть право выборки' ELSE PRINT 'Права выборки нет' А результат будет выведен не на вкладку Results, а на вкладку Messages (рис. 2.4). Рис. 2.4. Результат использования PRINT Задание 3. Вывести имя компьютера, на котором выполняется команда. Если имя компьютера более девяти букв, то вывести только первые шесть букв. Указания к выполнению: 1. Для получения имени компьютера используется функция HOST_NAME(). 2. Для определения длины строки можно воспользоваться функцией DataLength. 3. Пример выполнения задания: IF (DATALENGTH(HOST_NAME()) / 2 > 9) SELECT LEFT(HOST_Name(), 6) + '...' ELSE SELECT HOST_Name() Замечание. Обратите внимание, что результат функции DATALENGTH мы разделили на два. Это обусловлено тем, что HOST_NAME() возвращает тип nvarchar, в котором под каждый символ отводится два байта. Задание 4. Посчитать количество цифр в числе. Указания к выполнению: 1. Один из возможных вариантов решения данной задачи (см. рис.2.5): DECLARE @num int, @cnt int SET @num = 19 IF (@num = 0) SET @cnt = 1 ELSE BEGIN SET @cnt = 0 WHILE (@num <> 0) BEGIN SET @cnt = @cnt + 1 SET @num = @num / 10 END END SELECT @cnt AS 'Количество цифр' Рис. 2.5. Результат работы кода Самостоятельная работа 1. Оптимизировать код решения задания 4: избавиться от условного оператора, должен остаться только цикл WHILE, при этом код должен попрежнему работать как для нуля и положительных чисел, так и для отрицательных. 2. Определить, имеет ли пользователь право доступа к полю 'CardNumber', таблицы CreditCard в базе данных AdventureWorks2008. Если доступ есть, то вывести «Доступ есть», иначе – «В доступе отказано». 3. Написать программу пересчета веса из фунтов в килограммы (1 фунт равняется 453,6 г). Результат должен быть выведен следующим образом, например: 3.3 фунт(а/ов) – это 1 кг 496 г. 4. Вывести информацию о текущих именах сервера, учетной записи и пользователя базы данных в следующем виде: Вы вошли на сервер User400-01\SQL2008 как User400-01\User with dbo permissions. 5. Определить количество часов и минут, прошедших со времени запуска служб MS SQL Server. 6. Определить, является ли текущий год високосным. 7. Найти сумму чисел в заданной строке символов. 8. Определить величину оплаты за отправку телеграммы. Признаком завершения телеграммы является точка. Стоимость одного слова 33 коп, результат вывести с указанием количества рублей и копеек. Строка может содержать произвольное число пробелов. 9. Используя шифр Цезаря, зашифруйте заданную строку текста. Идея данного метода шифрования – алфавит размещается как бы по часовой стрелке. Для шифровки буквы текста заменяются буквами, отстоящими на заданное число букв (сдвиг) по часовой стрелке. 10.Известна фамилия, имя и отчество пользователя. Найти число его личности. Правило получения числа личности: каждой букве сопоставлено число – порядковый номер буквы в алфавите. Эти числа складываются, если полученная сумма не является однозначным числом, то цифры числа снова складываются и так до тех пор, пока не будет получено однозначное число. Лабораторная работа №3 Выборка данных Цель: научить использовать оператор SELECT и его основные разделы для выборки данных в соответствии с заданными условиями. Теоретический материал: перед выполнением лабораторной работы рекомендуется изучить лекцию №4 «Выборка данных», в которой изучается один из основных операторов языка SQL – SELECT и объясняется назначение каждого из его разделов. Требования к отчету: по результатам работы представить набор SQL-скриптов, решающих задачи из раздела «Самостоятельная работа». Задание 1. Подключитесь к серверу MyServ с помощью утилиты Management Studio. Указания к выполнению: 3. Запустите SQL Server Management Studio через меню Пуск – Программы – Microsoft SQL Server 2008. 4. Выберите тип аутентификации: SQL Server Authentication. Укажите User name: sa, и Password: пустой и нажмите кнопку Connect. Задание 2. Получите список стран с указанием их кода и последней даты изменения записи из таблицы CountryRegion БД AdventureWorks2008. Указания к выполнению: 1. Для выполнения задания нам потребуются атрибуты CountryRegionCode, [Name], ModifiedDate из таблицы Person.CountryRegion. Обратите внимание, что перед названием таблицы используется еще название схемы Person, предназначенной для управления объектами, связанными с работниками и департаментами. 2. Для переименования столбцов воспользуемся ключевым словом AS. 3. Убедитесь, что БД AdventureWorks2008 является текущей, и выполните следующий запрос: SELECT CountryRegionCode AS 'Код', [Name] AS 'Страна', ModifiedDate AS 'Дата изменения' FROM Person.CountryRegion Результат выполнения запроса показан на рис. 3.1. Рис. 3.1. Список стран Задание 3. Получите список сотрудников с указанием фамилии и первого символа имени, а также его идентификационного номера. Список должен быть упорядочен по фамилии и имени сотрудника. Указания к выполнению: 1. Первый столбец мы должны будем переименовать при помощи оператора AS, так как в нем необходимо объединить данные из двух столбцов: LastName и FirstName. 2. Для получения только первой буквы имени воспользуемся функцией Substring. 3. Для сортировки результирующей таблицы необходимо воспользоваться разделом ORDER BY. 4. Выполните следующий код: SELECT LastName+’ ‘+Substring(FirstName,1,1)+’.’ as [Имя сотрудника], BusinessEntityID FROM Person.Person ORDER BY [Имя сотрудника] Результат выполнения запроса показан на рис. 3.2. Рис. 3.2. Список сотрудников Замечание. По умолчанию сортировка осуществляется по возрастанию, что соответствует зарезервированному слову ASC (может не указываться), для сортировки в убывающем порядке указывается – DESC. Задание 4. Получите список товаров, цена которых находится в диапазоне от $12 до $20, отсортировав его по цене. Указания к выполнению: 1. Для выбора записей по заданному критерию необходимо воспользоваться разделом WHERE. 2. Можно использовать составное условие, тогда код будет выглядеть так: SELECT [Name], ListPrice From Production.Product WHERE (ListPrice>=12) and (ListPrice<=20) ORDER BY 2 3. Другой вариант: заменить два оператора сравнения одним логическим оператором BETWEEN, с помощью которого можно получить ответ на вопрос, лежит ли величина в указанном диапазоне: SELECT [Name], ListPrice From Production.Product WHERE ListPrice Between 12 and 20 ORDER BY ListPrice Результат выполнения запроса показан на рис. 3.3. Рис. 3.3. Список товаров с ценой от $12 до $20 Задание 5. Выведите имена сотрудников и их должностей, проживающих за пределами USA. Указания к выполнению: 1. Для поиска по шаблону символьных строк используется логический оператор LIKE, который чаще всего применяется в ситуациях, когда не известно точное совпадение. 2. В шаблоне нам потребуется указать служебный символ %, который подразумевает любую строку, состоящую из 0 и более символов. 3. Используя таблицу HumanResources.vEmployee составим запрос: Select LastName, JobTitle From HumanResources.vEmployee Where CountryRegionName Not Like ‘%United States%’ Результат выполнения запроса показан на рис. 3.4. Рис. 3.4. Сотрудники, проживающие за пределами США Задание 6. Получите список сотрудников из США и Канады. Указания к выполнению: 1. Для определения соответствия выражения одному из перечисленных в заданном списке значений применяется логический оператор IN. Данный оператор всегда может быть записан и в виде группы условий, объединенных операндом OR. 2. Запрос с использованием оператора IN будет выглядеть следующим образом: Select LastName, JobTitle From HumanResources.vEmployee WHERE CountryRegionName IN (‘United States’, ‘Canada’) Результат выполнения запроса показан на рис. 3.5. Рис. 3.5. Сотрудники из США и Канады Задание 7. Получите список товаров, у которых не указан цвет. Указания к выполнению: 1. Для проверки отсутствия значения используется функция выборки IS NULL. 2. Составим следующий запрос по таблице Product: SELECT [Name] FROM Production.Product WHERE Color IS NULL Результат выполнения запроса показан на рис. 3.6. Рис. 3.6. Товары, для которых не указан цвет Самостоятельная работа 1. Отобразите информацию о способах доставки товара (ShipMethod), если активный пользователь имеет право получения этих данных. 2. Сконструируйте запрос, возвращающий список сотрудников (таблица Employee) с указанием их EmployeeID, даты рождения (в формате dd.mm.yyyy) и возраста на сегодняшний день. Указание: для конвертирования значения одного типа в значение другого типа используется функция: CONVERT (тип, выражение [, стиль]). 3. Определите список товаров, поставка которых прекращена (используя SellEndDate), с указанием их цвета. 4. Получить расположения складов из Production.Location, содержащих ‘Paint’ в своем названии. 5. Отобразить список стран, в которых зарегистрированы заказчики. Выборку осуществлять из представления vIndividualCustomer, а не из таблицы, т.к. в таблице недостаточно сведений для такого запроса. 6. Вывести список сотрудников (просто указать их ID), у которых завтра день рождения, указав при этом их возраст. Если таких сотрудников нет, то вывести сообщение об этом. Решение оформить в виде хранимой процедуры. Указание: используйте логический оператор EXISTS (запрос), который принимает истинное значение, если указанный запрос возвращает хотя бы одну строку. 7. Отобразите список сотрудников (просто указав их ID), которые в следующем месяце будут отмечать юбилей, с указанием даты юбилея. 8. Определите 10 самых дорогих товаров. Решение оформить в виде хранимой процедуры. Лабораторная работа №4 Хранимые процедуры Цель: научить создавать и вызывать пользовательские хранимые процедуры, а также передавать в них параметры. Теоретический материал: перед выполнением лабораторной работы рекомендуется изучить лекцию №3 «Общие сведения о Transact-SQL», в которой даны основы синтаксиса языка SQL, и лекцию №5 «Вспомогательные объекты базы данных», где приведены базовые сведения о хранимых процедурах. Требования к отчету: по результатам работы представить набор SQL-скриптов, решающих задачи из раздела «Самостоятельная работа». Задание 1. Создайте хранимую процедуру, которая выводит имя компьютера, на котором выполняется команда. Если имя компьютера более девяти букв, то вывести только первые шесть букв. Указания к выполнению: 5. Для получения имени компьютера воспользуйтесь функцией HOST_NAME(). 6. Для создания процедуры выполните следующий код: CREATE PROCEDURE Test AS IF (DATALENGTH(HOST_NAME()) / 2 > 9) SELECT LEFT(HOST_Name(), 6) + ‘...' ELSE SELECT HOST_Name() Замечание. Хранимая процедура будет создана в текущей базе данных. 7. Убедитесь, что хранимая процедура была создана (см. рис. 4.1). Рис. 4.1. Список хранимых процедур в БД 8. Вызовите созданную хранимую процедуру, выполнив следующий код: TEST Задание 2. Создайте хранимую процедуру, принимающую число в качестве делителя и возвращающую количество цифр в нем через параметр OUTPUT. Указания к выполнению: 1. Создайте хранимую процедуру DigitCount с двумя параметрами: CREATE PROCEDURE DigitCount @num int, @cnt int OUTPUT AS IF (@num = 0) SET @cnt = 1 ELSE BEGIN SET @cnt = 0 WHILE (@num <> 0) BEGIN SET @cnt = @cnt + 1 SET @num = @num / 10 END END 2. Вызовите процедуру DigitCount и убедитесь, что она работает верно: DECLARE @num int = 1249 DECLARE @cnt int EXEC DigitCount @num, @cnt OUTPUT SELECT @cnt Замечание. Обратите внимание, что в данном случае использование ключевого слова EXEC обязательно перед вызовом хранимой процедуры, т.к. хранимая процедуры указана в блоке других SQL команд, а не выполняется одна. Самостоятельная работа 11.Определите количество системных хранимых процедур. Указание. Оформите решение следующих задач в виде хранимых процедур. 12.Определите время года для заданной даты: осень, зима, весна или лето. Замечание. Для управления форматом даты используется следующая команда: SET DATEFORMAT Формат. Опция Формат указывает формат ввода даты и может принимать следующие значения – mdy, dmy, ymd, myd и dym (где m, d и y – день, месяц и год соответственно). 13.Известна дата рождения пользователя. Проверить, исполнилось ему или нет полных 16 лет. 14.Установить, является ли строка символов адресом электронной почты. Сделайте так, чтобы исходный текст процедуры нельзя было просмотреть. Докажите правильность действий. Указание: в строке должен присутствовать символ @, после которого обязательно наличие хотя бы одной точки. 15.Удалите все созданные вами процедуры. Лабораторная работа №5 Система безопасности Microsoft SQL Server Цель: научить использовать системные хранимые процедуры для управления именами входа MS SQL Server и пользователями баз данных, а также разрешать и запрещать выполнение определенных действий некоторому пользователю. Теоретический материал: перед выполнением лабораторной работы рекомендуется изучить лекцию №6 «Система безопасности в базах данных», в которой подробно рассмотрены вопросы управления учетными записями и правами пользователя. Требования к отчету: по результатам работы представить отчёт со скриншотами, содержащими SQL-команды и результаты их выполнения для каждой задачи из раздела «Самостоятельная работа». Задание 1. Подключитесь к серверу MyServ с помощью утилиты Management Studio. Указания к выполнению: 9. Запустите SQL Server Management Studio через меню Пуск – Программы – Microsoft SQL Server 2008. 10. Выберите тип аутентификации: SQL Server Authentication. Укажите User name: sa, и Password: пустой и нажмите кнопку Connect. Задание 2. Определите список ролей сервера. Указания к выполнению: 1. Создайте новый запрос или через команду меню File – New – Query with Current Connection или при помощи кнопки New Query на панели инструментов. 2. Во вкладке SQLQuery1.sql выполните команду sp_helpsrvrole (см. рис. 5.1). Рис. 5.1. Серверные роли MS SQL Server Замечание. Для более наглядного представления данных используйте способ отображения информации в виде таблицы (кнопки Results to Grid/Results to Text на панели инструментов или через команды меню Query – Results To). Задание 3. Создайте и настройте новую учетную запись TempUser для входа в SQL Server. Указания к выполнению: 1. Для добавления учетной записи используйте хранимую процедуру sp_addlogin: sp_addlogin 'TempUser', 'Password!' Замечание. Для получения справки по командам Transact-SQL и хранимым процедурам можно воспользоваться утилитой SQL Server Management Studio. Для этого необходимо выделить имя оператора и нажать клавишу F1. 2. Убедитесь, что учетная запись была добавлена при помощи хранимой процедуры sp_helplogins (см. рис. 5.2). Рис. 5.2. Список имен пользователей MS SQL Server 3. Попробуйте войти на сервер под созданной учетной записью. 4. Зайдите снова под учетной записью sa, т.к. для дальнейших действий снова потребуются права администратора. 5. Для присвоения учетной записи для входа встроенной серверной роли используется процедура: sp_addsrvrolemember ‘TempUser’, ‘securityadmin’ Задание 4. Определите список AdventureWorks2008 и членов роли db_owner. ролей базы данных Указания к выполнению: 1. Выполните хранимую процедуру sp_helprole для получения списка как встроенных, так и определенных пользователем ролей базы данных. 2. При помощи команды sp_helprolemember ‘db_owner’ определите членов роли db_owner (см. рис. 5.3). Рис. 5.3. Список членов роли db_owner Задание 5. Создайте нового пользователя базы данных для логина TempUser. Указания к выполнению: 1. При помощи хранимой процедуры добавьте пользователя: sp_adduser 'TempUser', ‘MyFirstUser’ 2. При помощи процедуры sp_helpuser убедитесь, что пользователь был добавлен. Какая роль ему была присвоена? 3. Добавьте пользователю роль db_datareader: sp_addrolemember 'db_datareader, ‘MyFirstUser’ Задание 6. Настройте права доступа пользователю Andy: предоставьте явным образом право только для выборки из таблицы Product и обновления только полей Name и ListPrice этой таблицы. Указания к выполнению: 1. С помощью следующей команды пользователю TestUser базы данных AdventureWorks2008 предоставляются права выборки и изменения данных таблицы Orders этой базы данных: GRANT select, update on AdventureWorks2008.Production.WorkOrder to TestUser 2. Следующая команда предоставляет пользователю Andy права только выборки данных полей Name и ListPrice таблицы Product базы данных AdventureWorks2008: GRANT select on AdventureWorks2008.Production.Product (Name, ListPrice) to Andy Задание 7. Изучите выполнение вышеупомянутых функций при помощи графического интерфейса утилиты Management Studio. Указания к выполнению: 1. Просмотр списка имеющихся учетных записей и их параметров осуществляется выбором группы Logins в папке Security сервера. 2. Для создания новой учетной записи для входа необходимо выполнить команду New Login… контекстного меню узла Logins, в появившемся диалоговом окне указать: вкладка General: имя пользователя, тип аутентификации (при аутентификации средствами MS SQL Server – задать пароль), базу данных, к которой пользователь подключается автоматически, язык по умолчанию; вкладка Server Roles: роли сервера, в которые будет входить создаваемая учетная запись; вкладка User Mapping: доступ к одной из созданных на сервере базе данных, в поле User ввести имя пользователя базы данных и включить создаваемого пользователя в одну существующих ролей. Замечание. Для изменения параметров существующей учетной записи пользователя для входа необходимо выбрать ее из списка и выполнить команду контекстного меню Properties, для удаления – Delete. 3. Для отображения списка ролей сервера необходимо выбрать группу Server Roles в папке Security сервера. Просмотр пользователей, входящих в эту роль и разрешений, присвоенный ей, осуществляется выполнением команды контекстного меню Свойства. Замечание. Встроенные роли сервера не могут быть удалены из системы, и нельзя изменить определенные для них разрешения. Также запрещено создавать и собственные серверные роли. 4. Для просмотра и управления параметрами пользователей некоторой базы данных предназначена группа Security/Users этой базы. Учетные записи отображаются в поле User Name, а в поле Login Name – соответствующие им учетные записи для входа. Для создания нового пользователя базы данных необходимо выполнить команду New User…, затем в поле User name ввести имя пользователя, а в списке Login Name выбрать соответствующую учетную запись для входа. Можно также включить пользователя в роли базы данных. Замечание. Для изменения параметров учетной записи служит команда Properties, а для удаления – Delete. 5. Для отображения списка ролей базы данных используется группа Roles. Для просмотра пользователей, входящих в эту группу, необходимо выполнить команду Properties. 6. Чтобы назначить полномочия объекту безопасности необходимо выбрать его в группе Users (для изменения разрешения конкретного пользователя базы данных) или в группе Roles (для разрешений определенной роли). Для этих целей используется вкладка Securables. В появившейся вкладке перечислены все объекты базы данных, с возможными правами доступа. Можно установить одно из трех состояний доступа: предоставление (галочка), запрещение (крестик) и неявное отклонение (пустое поле) – в соответствующем поле. Задание 8. Отмените присвоение роли учетной записи и удалите учетную запись TempUser. Указания к выполнению: 7. Отмена присвоенной пользователю роли может быть выполнена с помощью процедуры: sp_droprolemember ‘db_datareader’, ‘MyFirstUser’ 8. Для удаления пользователя БД используются процедуры: sp_dropuser ‘MyFirstUser’ 9. Отмена присвоения учетной записи определенной роли выполняется с помощью хранимой процедуры: sp_dropsrvrolemember 'TempUser', ‘securityadmin’ 10.Для удаления учетной записи выполните хранимую процедуру: sp_droplogin 'TempUser' Самостоятельная работа 1. Определите список всех ролей сервера и действия, разрешенные пользователям роли dbcreator. 2. Установите, какая серверная роль присвоена системной учетной записи sa. 3. Определите, пользователь какой роли имеет возможность создания и удаления учетных записей для входа. 4. Изменение пароля учетной записи пользователя для входа выполняется с помощью процедуры sp_password. 5. Создайте собственную учетную запись для входа с подключением к базе данных AdventureWorks2008, докажите правильность выполненных действий. Созданной учетной записи присвойте права на создание и изменение баз данных, докажите правильность выполненных действий. Подключитесь к MS SQL Server, используя созданную учетную запись, и создайте еще одну учетную запись пользователя для входа, результат объясните. 6. Создайте пользователя manager базы данных AdventureWorks2008 на основе созданной ранее учетной записи для входа. Докажите правильность выполненных действий. 7. Пользователю manager присвойте роль, обладающую только возможностью просмотра содержимого базы данных AdventureWorks2008. Замечание. Для проверки правильности выполненных действий можно выполнить произвольный запрос к этой базе данных, например, отображающий содержимое таблицы Production.WorkOrder: SELECT * FROM Production.WorkOrder. 8. Пользователю manager запретите просмотр данных БД AdventureWorks2008, присвоив необходимую роль. Как доказать правильность внесенных изменений? 9. Какое количество пользователей базы данных может быть создано на основе одной учетной записи пользователя для входа? Ответ обоснуйте. 10. Средствами SQL Server Management Studio создайте учетную запись пользователя для входа на основе аутентификации SQL, подключающегося по умолчанию к базе данных AdventureWorks2008, имеющего права серверной роли diskadmin. 11. Определите список пользователей, входящих в роль diskadmin и ее разрешения. 12. В базе данных AdventureWorks2008 создайте пользователя на основе созданной ранее учетной записи для входа. 13. Для созданного ранее пользователя базы данных AdventureWorks2008 определите, членом какой роли он является и каково ее назначение. Имеет ли данный пользователь право выборки данных из таблицы Production.Product этой базы данных? Ответ обоснуйте и проверьте, выполнив извлечение данных командой SELECT * from Production.Product. 14. В базе данных AdventureWorks2008 создайте роль managers. Для этой роли определите право выборки данных из таблицы Production.Product базы данных AdventureWorks2008. Присвойте роль managers созданному ранее пользователю. Имеет ли теперь этот пользователь право выборки данных? Проверьте сделанный вывод. К каким еще объектам базы данных AdventureWorks2008 имеет право доступа этот пользователь? Обоснуйте и проверьте вывод. 15. Создайте пользователя, имеющего доступ к базе данных AdventureWorks2008 и принадлежащего роли clerks. Для этой роли определите возможность выборки данных из таблицы Production.Location только для полей Name и Availability. Для проверки правильности выполненных действий выполните команды: SELECT * from Production.Location – чтение данных из всех полей таблицы Authors; SELECT Name, Availability from Production.Location – чтение данных таблицы Production.Location только из указанных полей. 16. Для роли clerks запрещена выборка данных из таблицы Production.WorkOrder базы данных AdventureWorks2008. Пользователь Andy принадлежит пользовательской роли clerks и системной роли db_datareader. Может ли этот пользователь получить данные из этой таблицы? Лабораторная работа №6 Управление базами данных Цель: научить использовать SQL-команды для создания баз данных и изменения их структуры, а также выполнять резервное копирование и восстанавливать базы данных из резервных копий. Теоретический материал: перед выполнением лабораторной работы рекомендуется изучить лекцию №7 «Структура баз данных в MS SQL Server», в которой рассмотрена организация базы данных внутри СУБД MS SQL Server 2008, а также основные структурные элементы базы данных. Требования к отчету: по результатам работы представить отчёт со скриншотами, содержащими SQL-команды и результаты их выполнения для каждой задачи из раздела «Самостоятельная работа». Задание 1. Создайте базу данных Sales c журналом. Указания к выполнению: 7. Воспользуемся функцией CREATE DATABASE: CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'e:\saledat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'e:\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) 8. Выполните следующий код, чтобы убедиться, что БД была создана с нужными параметрами (рис. 6.1): sp_helpdb Sales Результат выполнения показан на рис. 6.1. Рис. 6.1. Сведения о базе данных Задание 2. Создайте резервную копию базы данных Sales. Указания к выполнению: 1. Создадим устройство для резервирования: sp_addumpdevice 'disk', 'backupdisk', 'e:\sales.bak' 2. Воспользуемся функцией BACKUP для выполнения резервного копирования: BACKUP DATABASE Sales TO backupdisk Результат выполнения показан на рис. 6.2. Рис. 6.2. Результат выполнения оператора BACKUP Самостоятельная работа Указание. Для доказательства правильности выполнения действий можно использовать процедуры sp_helpdb до выполнения некоторой операции и после. Задание 1. 1. Создайте пользователя, имеющего право создания и удаления баз данных. 2. Создайте собственную базу данных, размер основного файла которой 5 Мб, размер журнала – 2 Мб. Основной файл может увеличиваться до 10 Мб c шагом 20%. Объем файла журнала увеличивается до 5 Мб с шагом 1 Мб. Расположение файлов на диске – D:\MSSQL\DATA. 3. Убедитесь, что база данных создана должным образом. Задание 2. 1. Просмотрите список параметров базы данных, которые могут быть установлены. 2. Просмотрите список установленных параметров созданной Вами базы данных. 3. Определите использование базы данных только владельцем и в режиме поддержки одного пользователя. 4. Убедитесь в изменении параметров базы данных. Задание 3. 1. Переименуйте созданную Вами базу данных. Задание 4. 1. Создайте собственную файловую группу. 2. Для Вашей базы данных определите еще один файл размером 2 Мб и поместите его в созданную рабочую группу. 3. Докажите правильность выполненных Вами действий. Задание 5. 1. Для своей базы данных установите возможность автоматического сжатия данных. Задание 6. 1. Определите сведения о дисковом пространстве, занимаемом базой данных AdventureWorks2008. 2. Сожмите базу данных AdventureWorks2008 так, чтобы она содержала только 25% пространства, доступного ей на текущий момент. 3. Докажите правильность выполненного действия. Задание 7. 1. Для базы данных AdventureWorks2008 добавьте еще один файл к файловой группе PRIMARY. 2. Выполните сжатие базы данных AdventureWorks2008. Обоснуйте выбранные Вами параметры. 3. Докажите, что сжатие базы данных действительно выполнено. Задание 8. 1. Создайте резервную копию базы данных AdventureWorks2008. Физическое имя устройства резервного копирования: D:\MSSQL\BACKUP\AdventureWorks_backup.bak. 2. Выполните резервное копирование журнала транзакций базы данных AdventureWorks2008. Задание 9. 1. Удалите базу данных AdventureWorks2008. 2. Восстановите удаленную базу с устройства с физическим именем AdventureWorks_backup.bak. 3. Докажите правильность выполненного действия. Лабораторная работа №7 Выборка данных из нескольких таблиц Цель: научить использовать конструкцию JOIN для внешнего и внутреннего соединения двух или более таблиц. Теоретический материал: перед выполнением лабораторной работы рекомендуется изучить лекцию №4 «Выборка данных», в которой изучается один из основных операторов языка SQL – SELECT, и объясняется назначение каждого из его разделов, а также рассматриваются вопросы соединения нескольких таблиц. Требования к отчету: по результатам работы представить набор SQL-скриптов, решающих задачи из раздела «Самостоятельная работа». Задание 1. Получите список товаров с указанием их категорий. Указания к выполнению: 1. Так как в таблице Product нормализованной базы данных AdventureWorks2008 хранится только идентификатор категории товара, то чтобы получить список товаров с указанием их категорий, необходимо соединить таблицы Product и ProductSubcategory. 2. Перед указанием поля в операторе SELECT необходимо будет использовать имена таблиц Product и ProductSubcategory для разрешения конфликтов, т.к. в обеих таблицах присутствуют поля Name. SELECT Product.Name, ProductSubcategory.Name, Product.ListPrice FROM Production.Product INNER JOIN Production.ProductSubcategory ON Product.ProductSubcategoryID = ProductSubcategory.ProductSubcategoryID Результат выполнения запроса показан на рис. 7.1. Рис. 7.1. Результат соединения двух таблиц – товары с указанием категории Замечание. При таком соединении товары, для которых не указана их категория, не включаются в набор результатов. Задание 2. Создайте запрос, возвращающий имя заказчика и дату размещения заказа. Указания к выполнению: 1. Выполните следующий код: SELECT FirstName, LastName, OrderDate FROM Person.Person LEFT JOIN Sales.Customer ON Customer.PersonID = Person.BusinessEntityID LEFT JOIN Sales.SalesOrderHeader ON Customer.CustomerID = SalesOrderHeader.CustomerID Результат выполнения запроса показан на рис. 7.2. Рис. 7.2. Результат соединения трех таблиц – клиенты и даты размещения ими заказов Для лиц, не размещавших заказы, в поле OrderDate содержится значение NULL. При правом соединении (ключевое слово RIGHT JOIN) в результат включаются все записи правой таблицы, независимо от того, есть для них соответствующая строка в левой таблице или нет. Измените рассмотренный запрос так, чтобы он выдавал такие же результаты при использовании правого соединения. Задание 3. С помощью перекрестного соединения можно перечислить все возможные способы поставки товаров в базе данных Northwind (поставлялась с MS SQL Server до появления AdventureWorks2008). Указания к выполнению: SELECT DISTINCT Suppliers.Country, Orders.ShipCountry FROM Suppliers CROSS JOIN Orders Самостоятельная работа 1. Вывести фамилию и имя заказчиков из представления vIndividualCustomer, номер (SalesOrderNumber) и дату размещения ими заказов, начиная с 1 января 2003 года, из таблицы SalesOrderHeader. Если компания размещает несколько заказов в один день, то должна быть возвращена только одна запись. Указание: для ограничения числа записей в итоговом наборе данных, необходимо указывать условие в разделе WHERE. 2. Получить список товаров с указанием номера заказа и заказчика, заказанных в определенный день, например, 1 января 1998 года. Решение оформите в виде хранимой процедуры. 3. Сконструируйте запрос, возвращающий номер заказа, фамилию и имя заказчика, а также фамилию сотрудника, обработавшего этот заказ. 4. Создайте запрос о заказе каждого товара с указанием его наименования, цены и количества с помощью внутреннего и внешнего соединений. 5. В чем состоит отличие в использовании внутреннего и внешнего соединений при решении задачи №4? 6. Предложите вариант перекрестного AdventureWorks2008 и реализуйте его на SQL. соединения для БД 7. Получить набор данных, содержащий следующую информацию: фамилии и имена заказчиков, их адреса; название компаний-производителей, с указанием их адресов; фамилии, имена и адреса сотрудников. Указание: фамилия и имя должны быть выведены одним полем. Выборки данных осуществлять не из таблиц, а из следующих представлений: vEmployee, vIndividualCustomer, vVendor. Лабораторная работа №8 Аналитическая выборка данных Цель: научить использовать агрегатные функции и раздел GROUP BY оператора SELECT для аналитической выборки данных. Теоретический материал: перед выполнением лабораторной работы рекомендуется изучить лекцию №4 «Выборка данных», в которой изучается оператор SELECT и объясняется назначение каждого из его разделов, а также рассматриваются вопросы группировки данных. Требования к отчету: по результатам работы представить набор SQL-скриптов, решающих задачи из раздела «Самостоятельная работа». Задание 1. Вычислить среднюю цену товаров. Указания к выполнению: 1. Для вычисления средней цены необходимо воспользоваться агрегатной функцией AVG. 2. Агрегатная функция объединит значения поля ListPrice, так что следующий код вернет только одно число (рис. 8.1): 1. SELECT AVG(ListPrice) FROM Production.Product Рис. 8.1. Средняя цена товаров Задание 2. Определить имена заказчиков, разместивших заказы в последний учетный день. Указания к выполнению: 1. Для простоты сначала получим список только CustomerID, а не имен заказчиков. Для этого можно воспользоваться следующим запросом: 2. Select CustomerID From Sales.SalesOrderHeader 3. Where OrderDate=(SELECT Max(OrderDate) From SalesOrderHeader) Sales. Результат выполнения запроса показан на рис. 8.2. Рис. 8.2. ID клиентов, разместивших заказы в последний учетный день Замечание. Выполнение этого запроса осуществляется в два этапа: на первом – выполняется подзапрос, как самостоятельный запрос, который возвращает значение, используемое на втором этапе при выполнении внешнего запроса. 2. Для полного решения задачи выберем имена всех заказчиков из таблицы Person, которые присутствуют в списке, полученном в предыдущем пункте. Однако таблица Person не содержит поля CustomerID, поэтому придется еще соединить ее с таблицей Customer. Результирующий код будет выглядеть следующим образом: 4. SELECT FirstName + ' ' + LastName AS 'CustomerName' 5. FROM Person.Person 6. INNER JOIN Sales.Customer ON Customer.PersonID = Person.BusinessEntityID 7. WHERE CustomerID in 8. (SELECT CustomerID FROM Sales.SalesOrderHeader 9. WHERE OrderDate=(SELECT Max(OrderDate) FROM Sales. SalesOrderHeader)) Результат выполнения запроса показан на рис. 8.3. Рис. 8.3. Имена клиентов, разместивших заказы в последний учетный день Замечание. Такой запрос может быть оформлен и в виде соединения таблиц. Такие запросы обрабатываются значительно быстрее, поэтому если выполнение запроса не требуется выполнять в несколько этапов, использование подзапросов не обязательно. Задание 3. Определить список заказчиков, заказавших за один раз более 300 единиц товара. Указания к выполнению: 1. Для каждого заказа нам требуется получить общее количество товара, для этого потребуется составить связанный подзапрос. 2. Для того чтобы перед именами полей не писать каждый раз полное название таблиц, удобно воспользоваться псевдонимами. В данном случае определим следующие псевдонимы: для таблицы SalesOrderHeader псевдоним oh, а для SalesOrderDetail – od. 3. Результирующий код будет выглядеть следующим образом: 10. SELECT SalesOrderID, CustomerID 11. FROM Sales.SalesOrderHeader oh 12. WHERE 300<(SELECT sum(OrderQty) 13. FROM Sales.SalesOrderDetail od.SalesOrderID=oh.SalesOrderID) 14. od WHERE Задание 4. Для каждого товара отобразить сведения о самом крупном его заказе: количество заказанного товара и номер заказа. Указания к выполнению: 1. Для выполнения задания необходимо использовать внутреннее соединение таблиц Product и SalesOrderDetail, а также связанный подзапрос, возвращающий для каждого товара его максимальный заказ. 2. В запросе нам потребуется работа с таблицей SalesOrderDetail как во внешнем запросе, так и во внутреннем связанном подзапросе. Поэтому для данной таблицы мы создадим два псевдонима: od1 и od2. 3. Результирующий код будет выглядеть следующим образом: 15. SELECT Name, OrderQty, SalesOrderID 16. FROM Production.Product p Sales.SalesOrderDetail od1 17. ON od1.ProductID=p.ProductID 18. WHERE OrderQty = (SELECT Max(OrderQty) 19. FROM Sales.SalesOrderDetail od2 20. WHERE od1.ProductID=od2.ProductID) INNER JOIN Задание 5. Определить количество различных товаров в каждом заказе. Указания к выполнению: 1. Необходимо сгруппировать записи с одинаковым идентификационным номером заказа SalesOrderID и подсчитать количество записей в каждой группе по полю ProductID. Для этого можно использовать следующий запрос: 21. 22. 23. SELECT SalesOrderID, count(ProductID) AS [Количество] FROM Sales.SalesOrderDetail GROUP BY SalesOrderID Замечание. При использовании GROUP BY для каждой определенной группы значений выводится только одна запись в итоговом наборе данных. 2. Если для каждого заказа еще необходимо подсчитать и общее количество товаров в заказе, то запрос должен быть дополнен: 24. 25. 26. 27. 28. SELECT SalesOrderID, count(ProductID) AS [Количество], sum(OrderQty) as [Общее количество] FROM Sales.SalesOrderDetail GROUP BY SalesOrderID Замечание. При группировке записей допускается также использование раздела WHERE, в этом случае группируются записи, удовлетворяющие этому условию. Самостоятельная работа 1. Определить количество сотрудников компании в базе данных AdventureWorks2008. 2. Подсчитать максимальную стоимость доставки заказов. 3. Вывести список товаров, цена которых выше средней цены. 4. Решить данную задачу с использованием объединения таблиц. 5. Для каждого товара отобразить сведения о самом крупном его заказе: наименование, количество и номер заказа. Указание: используйте группировку по наименованию товара и номеру заказа. 6. Вывести список товаров, на которые поступило более 50 заказов. 7. Получить список только тех товаров, чье суммарное количество по заказам превышает 500 штук. 8. Определить 10 товаров, наиболее популярных у заказчиков. Решение задачи оформить в виде хранимой процедуры. 9. Определить общее количество и суммарную стоимость всех заказов для каждого заказчика. 10. Вычислить суммарную стоимость каждого заказа с учетом скидки, указав при этом наименование компании, выполнившей его. 11. Выяснить, товары наибольшим спросом. какого типа пользуются у заказчиков 4. САМОСТОЯТЕЛЬНАЯ РАБОТА МАГИСТРА СРМ № 1 Тема:Компоненты Microsoft SQL Server Цель:Создать правильно сконфигурированный Microsoft SQL Server 2008 как на стороне сервера, так и на стороне клиента СРМ № 2 Тема:Введение в Transact-SQL Цель:изучить основные операторы и алгоритмические конструкции TransactSQL. СРМ № 3 Тема:Выборка данных Цель:научить использовать оператор SELECT и его основные разделы для выборки данных в соответствии с заданными условиями. СРМ № 4 Тема:Хранимые процедуры Цель:научить создавать и вызывать пользовательские хранимые процедуры, а также передавать в них параметры. СРМ № 5 Тема:Система безопасности Microsoft SQL Server Цель:научить использовать системные хранимые процедуры для управления именами входа MS SQL Server и пользователями баз данных, а также разрешать и запрещать выполнение определенных действий некоторому пользователю. СРМ № 6 Тема:Управление базами данных Цель:научить использовать SQL-команды для создания баз данных и изменения их структуры, а также выполнять резервное копирование и восстанавливать базы данных из резервных копий. СРМ № 7 Тема:Выборка данных из нескольких таблиц Цель: научить использовать конструкцию JOIN для внешнего и внутреннего соединения двух или более таблиц. СРМ № 8 Тема:Аналитическая выборка данных Цель:научить использовать агрегатные функции и раздел GROUP BY оператора SELECT для аналитической выборки данных.