- •Серверы баз данных Курс лекций
- •Предисловие
- •Серверы баз данных. Основные понятия
- •История развития субд
- •Перспективы развития субд
- •Трехуровневая архитектура бд. Ее назначение
- •Модели клиент- сервер в технологии бд
- •Пользователи бд
- •Разработчики и администраторы приложений.
- •Контрольные вопросы
- •Двухуровневые модели
- •Модель удаленного доступа к данным
- •Удаленная презентация (Модель сервера бд)
- •Модель распределенной бд
- •Модель сервера приложений
- •Проектирование баз данных
- •Этапы разработки базы данных
- •Критерии оценки качества логической модели данных
- •Алгоритм нормализации (приведение к 3нф)
- •Элементы модели "сущность-связь"
- •Основные понятия er-диаграмм
- •Пример разработки er-модели
- •Описание предметной области
- •Описание сущностей и типов связей
- •П ереход к реляционной модели
- •Концептуальные и физические er-модели
- •Контрольные вопросы
- •Языки бд. Язык определения данных
- •Создание бд. Способы создания бд
- •Создание таблиц базы данных
- •Декларативные ограничения при создании таблиц
- •Задание ограничений ссылочной целостности
- •Изменение таблиц
- •Создание индексов в системе sql-сервер
- •Кластеризованный индекс
- •Контрольные вопросы
- •Языки бд. Язык управления данными
- •Выборка данных
- •Сортировка результатов запроса
- •Вложение запросов
- •Создание таблицы из набора результатов
- •Использование оператора union
- •Запросы на модификацию данных
- •Запросы на удаление
- •Запросы на добавление
- •Вставка записей из другой таблицы
- •Добавление данных в указанные поля
- •Values(‘31.03.03’,’согласен’,3000,4)
- •Запросы на обновление
- •Контрольные вопросы
- •Создание представлений
- •Создание, удаление и обновление представлений
- •Модифицируемые и немодифицируемые представления
- •Контрольные вопросы
- •Хранимые процедуры
- •Элементы Transact sql
- •Оператор условия
- •Циклическое выполнение операций
- •Функции
- •Создание хранимых процедур
- •Выполнение хранимой процедуры.
- •Контрольные вопросы
- •Триггеры
- •Назначение триггеров
- •Создание триггеров
- •Принцип работы триггеров
- •Включение и отключение триггера. Удаление триггера, Просмотр информации о триггерах
- •Контрольные вопросы
- •Транзакции и блокировки
- •Понятие транзакции
- •Свойства транзакций. Способы завершения транзакций
- •Операторы Transact sql для работы с транзакциями
- •Журнал транзакций.
- •Блокировки.
- •Сериалиация транзакций
- •Переопределение блокировок на уровне запроса. Типы блокировок
- •Контрольные вопросы
- •Безопасность данных и привилегии
- •Принципы защиты баз данных от несанкционированного доступа
- •Защита данных в системе ms sql Server
- •Контрольные вопросы
- •Организация доступа к бд из прикладных программ
- •Понятие курсора
- •Интерфейс прикладного программирования
- •Архитектура odbc
- •Архитектура odbc
- •Контрольные вопросы
- •Файловые структуры, используемые для хранения информации в бд.
- •Файлы прямого и последовательного доступа
- •Индексные файлы
- •Файлы с плотным индексом
- •Файлы с неплотным индексом
- •Моделирование отношений 1:м на файловых структурах
- •Моделирование отношений 1:м с использованием однонаправленных указателей
- •Структура записи подчиненного файла.
- •Алгоритм удаление записи из цепочки подчиненного файла.
- •Инвертированные списки
- •К Рисунок 14 онтрольные вопросы
- •Содержание
- •Литература
Организация доступа к бд из прикладных программ
Понятие курсора
Язык SQL предназначен для организации доступа к БД. Доступ к данным может быть осуществлен в 2-х режимах:– интерактивном и в режиме выполнения приложений. SQL не является языком программирования. Для создания приложений используются другие языки, в которые встраиваются операторы SQL. Все возможности интерактивного языка запросов доступны и в прикладном программировании
Существует 2 способа применения SQL в прикладных программах:
Встроенный SQL. При таком подходе операторы SQL непосредственно встраиваются в исходный текст программы на базовом языке. При компиляции программы со встроенными операторами SQL используется специальный препроцессор SQL, который преобразует исходный текст в исполняемую программу.
Интерфейс программирования приложений (API). При использовании этого метода прикладная программа взаимодействует с СУБД путем применения специальных функций. Вызывая эти функции, программа передает СУБД операторы SQL и получает обратно результаты запросов.
При объединении операторов SQL с базовым языком программирования соблюдаются следующие принципы:
Операторы SQL включаются в текст программы на исходном языке программирования. Исходная программа поступает на вход препроцессора, который компилирует операторы SQL.
Встроенные операторы SQL могут ссылаться на переменные базового языка программирования.
Встроенные операторы SQL получают результаты SQL запросов с помощью переменных базового языка программирования.
Для обеспечения построчной обработки результатов запроса во встроенный SQL добавлено несколько новых операторов, отсутствующих в интерактивном SQL.
При встраивании в программу операторов манипулирования данными они не требуют никаких изменений. Изменений требует только оператор SELECT. В интерактивном SQL набор данных, возвращаемый оператором SELECT, просто выводится на экран. Встроенный в программу оператор SELECT должен создавать структуры данных, которые согласуются с базовым языком программирования. Во встроенном SQL запросы делятся на 2 типа:
Однострочные. Строка может содержать значения нескольких столбцов.
Многострочные запросы. При этом приложение должно иметь возможность обработать все строки. Значит должен существовать механизм, поддерживающий просмотр и обработку большого числа строк.
Вывод запроса трудно передать переменным, если неизвестно, насколько велики будут результаты вывода. В SQL это осуществляется с помощью курсора.
Первый тип запроса во встроенном SQL вызвал модификацию оператора SELECT, который выглядит следующим образом:
SELECT < список атрибутов>
INTO <список переменных базового языка>
FROM
WHERE
В указанные переменные будет помещен результат однострочного запроса, поэтому список переменных должен быть согласован как по порядку, так и по типу данных со списком возвращаемых атрибутов.
Для реализации многострочных запросов вводится новое понятие – курсора или указателя записей.
Курсор – это вид переменной, которая связана с запросом. Значением этой переменной может быть каждая строка, которая выводится при запросе. Курсор должен быть объявлен прежде, чем он будет использован. Для объявления курсора служит команда DECLARE CURSOR. Оператор определяет исполняемый запрос, задает имя курсора и связывает результаты запроса с заданным курсором.
DECLARE STIPCUR CURSOR
FOR
SELECT NOM_ZACH,SFAM,STIP
FROM STUDENTS
WHERE STIP=30;
Этот запрос не будет выполнен немедленно, так как в данном случае представлено только его определение. Курсор напоминает представление, в котором определение содержит запрос, а содержательной частью является любой вывод запроса, и это происходит каждый раз, когда курсор становится открытым. Однако в отличие от базовых таблиц или представлений, строки курсора упорядочены и имеются первая, вторая и т.д., а также последняя строка.
Оператор OPEN CURSOR дает команду СУБД выполнить описанный запрос, создать виртуальный набор строк, который соответствует заданному запросу. Оператор OPEN устанавливает курсор (указатель записей) перед первой строкой виртуального набора строк результата.
Итак, когда в программе необходимо выполнить запрос, то открывают курсор с помощью следующей команды:
EXEC SQL OPEN CURSOR STIPCUR;
Значения в курсор передаются именно тогда, когда выполняется приведенная выше команда.
После открытия указатель текущей строки установлен перед первой строкой курсора.
Команда FETCH перемещает указатель текущей строки в виртуальном наборе записей на следующую строку и присваивает базовым переменным значения столбцов, соответствующие текущей строке. В большинстве коммерческих СУБД оператор FETCH реализует более широкие функции перемещения, перемещая указатель на произвольную запись, на первую, последнюю и т.д.
Например:
EXEC SQL FETCH STIPKUR INTO : @NOM_ZACH, @SFAM, @STIP;
Эта конструкция присвоит значение из первой выбранной строки в переменные памяти. Следующая команда FETCH выведет очередной набор значений и.т.д. Как правило, команду FETCH помещают внутрь цикла так, чтобы, выбрав строку из курсора, можно было осуществить перемещение набора значений из этой строки в переменные, возвратиться обратно и переместить следующий набор значений в эти же переменные.
Оператору OPEN CURSOR должен соответствовать оператор CLOSE CURSOR. Оператор закрытия курсора закрывает временную таблицу созданную оператором открытия курсора и прекращает доступ прикладной программы к этому объекту.
Курсоры в прикладных программах часто используются для последовательного просмотра данных. Если курсор не связан с операцией группировки, то каждая строка курсора соответствует строго одной строке исходной таблицы, Курсор удобно использовать для корректировки данных. В стандарте определены операции модификации данных, связанных с курсором. Например, операция удаления строки, связанной с текущим указателем:
DELETE FROM <имя таблицы> WHERE CURRENT OF <имя курсора>
Если указанный курсор открыт, и установлен на некоторую строку, то данная строка удаляется. Для того чтобы прочитать следующую строку необходимо выполнить оператор FETCH NEXT.
Аналогично выполняется команда обновления. Для того чтобы можно было применять позиционные команды удаления и обновления, курсор должен удовлетворять определенным требованиям: запрос, связанный с курсором должен считывать данные только из одной таблицы; в запросе не должно быть предложения ORDER BY, для того чтобы сохранялось взаимно однозначное соответствие строк курсора и исходной таблицы; запрос не должен содержать предложения GROUP BY или HAVING.
Курсор представляет собой удобное средство для формирования бизнес - логики приложений, но следует иметь в виду, что если открывается курсор с возможностью модификации, то СУБД блокирует все строки базовой таблицы, вошедшей в курсор, и тем самым блокируется работа других пользователей с данной таблицей.
В развитых моделях серверов БД большая часть бизнес логики приложения выполняется на сервере с использованием хранимых процедур. В связи с этим курсоры разделяются на курсоры сервера и курсоры клиента. Курсор сервера создается и выполняется на сервере, и определяется обычно в хранимых процедурах или триггерах. Курсоры клиента определяются в прикладных программах, выполняемых на клиенте. Набор строк, связанный с данным курсором, пересылается на клиент и там обрабатывается. Если с курсором связан большой набор данных, то операция пересылки набора строк, связанных с курсором, может занять значительное время и значительные ресурсы сети и клиентского компьютера. С этой точки зрения курсоры сервера более экономичны и выполняются быстрее.
