
- •Серверы баз данных Курс лекций
- •Предисловие
- •Серверы баз данных. Основные понятия
- •История развития субд
- •Перспективы развития субд
- •Трехуровневая архитектура бд. Ее назначение
- •Пользователи бд
- •Разработчики и администраторы приложений.
- •Контрольные вопросы
- •Модели клиент- сервер в технологии бд
- •Двухуровневые модели
- •Модель удаленного доступа к данным
- •Удаленная презентация (Модель сервера бд)
- •Модель распределенной бд
- •Модель сервера приложений
- •Проектирование баз данных
- •Этапы разработки базы данных
- •Критерии оценки качества логической модели данных
- •Алгоритм нормализации (приведение к 3нф)
- •Элементы модели "сущность-связь"
- •Основные понятия er-диаграмм
- •Пример разработки er-модели
- •Описание предметной области
- •Описание сущностей и типов связей
- •П ереход к реляционной модели
- •Концептуальные и физические er-модели
- •Контрольные вопросы
- •Языки бд. Язык определения данных
- •Создание бд. Способы создания бд
- •Создание таблиц базы данных
- •Декларативные ограничения при создании таблиц
- •Задание ограничений ссылочной целостности
- •Изменение таблиц
- •Создание индексов в системе sql-сервер
- •Кластеризованный индекс
- •Контрольные вопросы
- •Языки бд. Язык управления данными
- •Выборка данных
- •Сортировка результатов запроса
- •Вложение запросов
- •Создание таблицы из набора результатов
- •Использование оператора union
- •Запросы на модификацию данных
- •Запросы на удаление
- •Запросы на добавление
- •Вставка записей из другой таблицы
- •Добавление данных в указанные поля
- •Values(‘31.03.03’,’согласен’,3000,4)
- •Запросы на обновление
- •Контрольные вопросы
- •Создание представлений
- •Создание, удаление и обновление представлений
- •Модифицируемые и немодифицируемые представления
- •Контрольные вопросы
- •Хранимые процедуры
- •Элементы Transact sql
- •Оператор условия
- •Циклическое выполнение операций
- •Функции
- •Создание хранимых процедур
- •Выполнение хранимой процедуры.
- •Контрольные вопросы
- •Триггеры
- •Назначение триггеров
- •Создание триггеров
- •Принцип работы триггеров
- •Включение и отключение триггера. Удаление триггера, Просмотр информации о триггерах
- •Контрольные вопросы
- •Транзакции и блокировки
- •Понятие транзакции
- •Свойства транзакций. Способы завершения транзакций
- •Операторы Transact sql для работы с транзакциями
- •Журнал транзакций.
- •Блокировки.
- •Сериалиация транзакций
- •Переопределение блокировок на уровне запроса. Типы блокировок
- •Контрольные вопросы
- •Безопасность данных и привилегии
- •Принципы защиты баз данных от несанкционированного доступа
- •Защита данных в системе ms sql Server
- •Контрольные вопросы
- •Организация доступа к бд из прикладных программ
- •Понятие курсора
- •Интерфейс прикладного программирования
- •Архитектура odbc
- •Архитектура odbc
- •Контрольные вопросы
- •Файловые структуры, используемые для хранения информации в бд.
- •Файлы прямого и последовательного доступа
- •Индексные файлы
- •Файлы с плотным индексом
- •Файлы с неплотным индексом
- •Моделирование отношений 1:м на файловых структурах
- •Моделирование отношений 1:м с использованием однонаправленных указателей
- •Структура записи подчиненного файла.
- •Алгоритм удаление записи из цепочки подчиненного файла.
- •Инвертированные списки
- •К Рисунок 14 онтрольные вопросы
- •Литература
- •Содержание
Создание, удаление и обновление представлений
Представление создается командой CREATE VIEW, после которой указывается имя представления, а затем следует запрос, формирующий тело представления.
Создание представлений рассматривается на примере БД, содержащей следующие таблицы:
STUDENTS (NOM_ZACH,SFAM,SNAME, STIP)
PREDM (PKOD, PNAME, TNUM, HOURS, COURS)
PREP (TNUM,TFAM,TNAME, TSIRNAME)
USP (NOM_ZACH, PKOD, TNUM,UDATE, MARK)
Например, для создания представления о студентах, получивших стипендию в размере выше 70 рублей можно использовать следующую команду
CREATE VIEW OTLSTUD
AS SELECT *
FROM STUDENTS
WHERE STIP > 70;
В БД теперь существует представление с именем OTLSTUD, которое можно использовать также как любую таблицу. Это представление является горизонтальным, так как оно позволяет ограничить доступ пользователей к определенным строкам.
Преимущество представления по сравнению с запросами к БД заключается в том, что оно будет модифицировано автоматически всякий раз, когда таблица, лежащая в его основе изменяется. Например, если появится еще один студент со стипендией выше 30 т.р., он автоматически отобразиться в представлении.
Вертикальные представления позволяют ограничить доступ пользователей к нескольким столбцам таблицы, исключив некоторые поля. Например, для того, чтобы скрыть данные о стипендии, надо отобрать в таблицу все поля, исключая поле STIP.
CREATE VIEW STIPOFF
AS SELECT NOM_ZACH, SFAM, SNAME
FROM STUDENTS;
Представление можно изменять командами модификации DML, но фактически, команды будут перенаправлены к базовой таблице. Например, выполнение команды
UPDATE STIPOFF
SET SNAME=”Степан”
WHERE NOM_ZACH= 200201;
аналогично выполнению той же команды для таблицы STUDENTS.
Однако команда модификации размера стипендии у того же студента будет отвергнута системой, т.к. поле STIP отсутствует в представлении. Кроме того, не все представления могут быть модифицированы.
В рассмотренном примере поля представлений имеют имена, полученные непосредственно из имен полей основной таблицы. Однако иногда возникает необходимость назвать столбцы новыми именами. Это, например, может потребоваться в случае, если столбцы являются вычисляемыми и поэтому не имеющими имен.
Имена, которые необходимо присвоить полям, записываются в круглых скобках после имени таблиц. Они могут не указываться, если совпадают с именами полей запрашиваемой таблицы.
Когда делается запрос к представлению, то на самом деле система обращается к базовым таблицам. Например, при выполнении команды
SELECT *
FROM OTLSTUD
WHERE SNUM > 200201;
СУБД фактически осуществляет следующий запрос:
SELECT *
FROM STUDENTS
WHERE STIP >30 and SNUM > 200201;
Однако иногда возникают ситуации, когда появляются проблемы с представлением в результате комбинации из 2-х допустимых предикатов, которые не будут работать. В качестве иллюстрации создадим представление, которое содержит данные о количестве студентов, получающих ту или иную стипендию:
CREATE VIEW STIPCOUNT(STIP,KOL)
AS SELECT STIP,COUNT (*)
FROM STUDENTS
GROUP BY STIP;
Теперь обратимся к этому представлению, чтобы выяснить, есть ли такой размер стипендии, который получен двумя студентами:
SELECT *
FROM STIPCOUNT
WHERE COL =2;
Если запрос к представлению преобразовать к запросу к исходной таблице, то, скорее всего, будет получено
SELECT STIP,COUNT(*)
FROM STUDENTS
WHERE COUNT(*)=2
GROUP BY STIP;
Последний запрос недопустим, так как агрегатные функции не могут использоваться в предикате. Возникает закономерное предположение о то, что СУБД в некоторых случаях не может правильно сформулировать запрос к базовым таблицам, а значит выполнить его. Все зависит от того, каким образом и по каким алгоритмам система интерпретирует пользовательские команды. Правильным способом формирования приведенного выше запроса будет такой:
SELECT STIP,COUNT(*)
FROM STUDENTS
GROUP BY STIP;
HAVING COUNT(*)=2;
Однако SQL может не выполнить такого превращения. В этом случае следует проверить, справляется ли используемая СУБД с аналогичными запросам, и в соответствии с этим формировать запросы к представлениям.
В SQL существует понятие групповых представлений, то есть таких, которые содержат предложение GROUP BY или которые основаны на других групповых представлениях. Предыдущий пример представления как раз относится к числу групповых представлений. Теперь каждый раз, когда требуется получить количество студентов, получающих ту или иную стипендию, достаточно просто выбрать все записи рассматриваемого представления вместо того, чтобы создавать достаточно сложный запрос.
Представления могут быть основаны на нескольких базовых таблицах. Например, создадим представление, которое показывало бы оценки студента по учебному предмету, причем содержало бы не коды, а полные названия.
CREATE VIEW STUDOCEN
AS SELECT STUDENTS.SFAM ,PREDM.PNAME, USP.MARK
FROM STUDENTS,PREDM,USP
WHERE STUDENTS.NOM_ZACH=USP.NOM_ZACH
AND USP.PKOD= PREDM.PKOD;
С помощью такого представления можно выводить оценки для любого студента, например,
SELECT *
FROM STUDOCEN
WHERE SFAM=”Иванов”;
Допускается соединение представлений с другими базовыми таблицами или представлениями. Например, можно получить информацию не только об оценках, но и о дате их получения.
SELECT SFAM,PNAME,OCENKA, UDATE
FROM STUDOCEN,USP
WHERE STUDENTS.SFAM=”Иванов”;
В представлениях могут использоваться подзапросы. Например, если необходимо вывести в представление все оценки по дисциплине со значениями выше средней оценки:
CREATE VIEW AVGOC
AS SELECT *
FROM USP A
WHERE MARK > (SELECT AVG(MARK)
FROM USP B
WHERE A.PCOD=B.PCOD);
Извлечение данных осуществляется запросом:
SELECT *
FROM AVGOC;