- •Глава 1. Базы данных и системы управления 9
- •Глава 2. Организация доступа к данным 45
- •Глава 3. Реляционная алгебра 60
- •Глава 4. Основы sql 67
- •Глава 5. Проектирование реляционных баз данных 89
- •Глава 6. Взаимодействие sql с приложениями 116
- •Глава 7. Некоторые проблемы администрирования баз данных 154
- •Базы данных и системы управления
- •Файловые системы
- •Концепция баз данных
- •Основные функции субд
- •Непосредственное управление данными во внешней памяти
- •Управление буферами оперативной памяти
- •Управление транзакциями
- •Журнализация
- •Поддержка языков баз данных
- •Трехуровневая модель архитектуры систем баз данных
- •Модели данных
- •Характеристика связей
- •Компьютерно-ориентированные модели данных
- •Реляционный подход
- •Ключи и целостность реляционных данных
- •Моделирование концептуальной схемы базы данных
- •Организация доступа к данным
- •Страницы и файлы
- •Индексирование
- •Структуры типа б-дерева
- •Хеширование
- •Методы сжатия
- •Метод дифференциального сжатия
- •Иерархические методы сжатия
- •Кодирование по методу Хаффмена
- •Реляционная алгебра
- •Традиционные реляционные операции
- •Специальные реляционные операции
- •Дополнительные реляционные операции
- •Примеры использования реляционной алгебры для выражения словесных запросов в виде формул
- •Основы sql
- •Типы данных
- •Строковые типы данных
- •Битовые типы данных
- •Точные числовые типы данных
- •Вещественные числовые типы данных
- •Календарные типы данных
- •Значения null
- •Создание и обслуживание таблиц
- •Запрос на выборку
- •Статистические функции
- •Создание соединений
- •Вложенные запросы
- •Запрос на объединение
- •Запросы, выполняющие реляционные операции вычитания, пересечения и деления
- •Запросы на изменение
- •Перекрестные запросы
- •Проектирование реляционных баз данных
- •Нормализация отношений
- •Функциональные зависимости
- •Н ормальные формы, обоснованные функциональными зависимостями
- •Нормальная форма Бойса–Кодда
- •Нормальные формы, обоснованные более сложными зависимостями
- •Процедура нормализации и проектирования
- •Пример проектирования базы данных
- •Назначение и предметная область
- •Проектирование базы данных
- •Взаимодействие sql с приложениями
- •Встраивание sql-операторов в программный код
- •Тип курсора
- •Триггеры
- •Хранимые процедуры
- •Стандартные интерфейсы для доступа к данным
- •Информационное окружение веб-сервера
- •Стандарт odbc
- •Уровни соответствия
- •Уровень соответствия odbc
- •Задание имени источника данных odbc
- •Расширяемый язык разметки xml
- •Xml как язык разметки
- •Материализация хмl-документов с помощью xslt
- •Создание хмl-документов на основе информации из базы данных
- •Некоторые проблемы администрирования баз данных
- •Оптимизация запросов
- •Параллельная обработка данных
- •Потеря обновления
- •Зависимость от незафиксированных обновлений
- •Несогласованный анализ
- •Блокировки транзакций
- •Согласованность и уровень изоляции транзакций
- •Распределенные системы баз данных
- •Фрагментация
- •Репликация
- •Распространение обновлений
- •Управление каталогом
- •Распределенная обработка запросов
- •Типы распределенных систем баз данных
- •Нераспределенные мультибазовые субд
- •Клиент-серверные системы
- •Системы с общими ресурсами
- •Технические аспекты администрирования базы данных
- •Восстановление базы данных
- •Безопасность баз данных
- •Шифрование данных
- •Производительность баз данных
- •Администрирование данных
- •Литература
Хранимые процедуры
Хранимая процедура (stored procedure) – это написанная на языке баз данных программа, которая выполняет некоторые действия с информацией в базе данных и при этом сама хранится в базе данных в скомпилированном виде. Хранимые процедуры могут принимать входные параметры и возвращать результаты. В отличие от триггеров, которые принадлежат определенной таблице или представлению, хранимые процедуры принадлежат базе данных в целом. Они могут вызываться любым процессом, использующим базу данных, при условии, что у этого процесса есть достаточные права доступа.
Хранимые процедуры используются для многих целей. Хотя администраторы баз данных используют их для выполнения рутинных задач администрирования, главной областью их применения являются все же приложения баз данных. Эти процедуры могут вызываться из прикладных программ, написанных на таких языках, как Java, C#, C++, а также из веб-сценариев, написанных на VBScript или JavaScript. Кроме того, эти процедуры можно вызывать в интерактивном режиме из командной оболочки СУБД – например, Query Analyzer в SQL.
В отличие от кода приложения, хранимые процедуры никогда не передаются на клиентские компьютеры. Они всегда находятся в базе данных и выполняются СУБД на том компьютере, где располагается сервер базы данных. Таким образом, они более безопасны, чем распространяемый код приложения, а кроме того, снижают сетевой трафик. Хранимые процедуры постепенно становятся предпочтительным режимом реализации логики приложения в сети Интернет и корпоративных интрасетях. Еще одно преимущество хранимых процедур заключается в том, что SQL-операторы в них могут быть оптимизированы компилятором СУБД.
Основные преимущества использования хранимых процедур:
Большая безопасность,
Меньший сетевой трафик,
Команды SQL можно оптимизировать,
Совместное использование кода:
меньшее количество работы;
стандартизированная обработка;
специализация между разработчиками.
Когда логика приложения реализуется в виде хранимой процедуры, полученный код может совместно использоваться разными программистами. Совместное использование не только уменьшает трудозатраты, но и обеспечивает стандартизацию обработки. Кроме того, это позволяет более эффективно распределить работу: программисты, специализирующиеся на базах данных, могут создавать хранимые процедуры, а другие программисты, например, специализирующиеся на веб-разработке, могут выполнять другую работу.
В качестве примера рассмотрим хранимую процедуру Добавить_Произведение, регистрирующую приобретение произведений галереей. Этот код является упрощенным, но стиль его близок к тому, что используется в SQL Server.
CREATE PROCEDURE Добавить_Произведение ( @ХудожникID int; /*Художник должен уже присутствовать в базе данных*/ @Название char(25); @Описание varchar(1000); @Цена_Приобретения Numeric(6,2); )
/* Хранимая процедура, регистрирующая приобретение галереей произведения. Если произведение никогда раньше не появлялось в галерее, в таблицу Произведения добавляется новая строка. В противном случае используется существующая строка. Далее добавляется строка в таблицу Сделки, а столбец Дата_Приобретения в ней устанавливается равным системной дате. */
AS DECLARE @rowcount as int DECLARE @workID as int
/*Сначала убедимся, что ХудожникID присутствует в таблице Художники */
SELECT @rowcount = Count(*) FROM Художники X WHERE X.ХудожникID = @ХудожникID IF @rowcount = 0 /* Нет такого художника */ BEGIN Print ‘Нет художника с ID = ' + Str(@ХудожникID) Print ‘Обработка прервана.' Return END
/* Теперь смотрим, есть ли это произведение в базе данных */
SELECT @rowcount = Count(*) FROM Произведения W WHERE W.ХудожникID = (@ХудожникID AND W.Название = @Название IF @rowcount = 0 /* Произведения нет в базе, записываем его */ INSERT INTO Произведения (Название, Описание, ХудожникID) VALUES (@Название, @Описание, @ХудожникID)
/* Получаем значение суррогатного ключа ПроизведениеID (тип данных Счетчик) */
SELECT @ПроизведениеID = W. ПроизведениеID FROM Произведения W WHERE W.ХудожникID = (@ХудожникID AND W.Название = @Название
/* Вставляем новую строку в таблицу Сделки */
INSERT INTO Сделки(Дата_Приобретения, Цена_Приобретения, ПроизведениеID VALUES (GetDate(), @Цена_Приобретения, @ПроизведениеID)
RETURN
Процедура Добавить_Произведение принимает четыре входных параметра и не возвращает никакого значения.
Процедура подразумевает, что переданное ей значение ХудожникID является действующим идентификатором. Чтобы убедиться в том. что это так. первый блок операторов подсчитывает количество строк, имеющих указанное значение ХудожникID. Если это количество равно нулю, значит, процедуре было передано недопустимое значение ХудожникID; в этом случае процедура выводит сообщение об ошибке и завершает работу.
В противном случае процедура проверяет, не появлялось ли это произведение в галерее в прошлом. Если да, то в таблице уже есть строка, содержащая данные о художнике и названии произведения. Если нет, то в таблице Произведения создается новая строка. После этого с помощью оператора SELECT процедура получает значение ПроизведениеID. Если мы имеем дело с только что созданной строкой в таблице Произведения, этот оператор необходим, чтобы получить твое значение суррогатного ключа ПроизведениеID. Если произведение уже существовало в базе данных, то с помощью этого оператора мы получаем ПроизведениеID уже существующей строки.
Получив значение ПроизведениеID, процедура вставляет новую строку в таблицу Сделки. Для присвоения значения по умолчанию столбцу Дата_Приобретения используется системная функция GetDate().
Как и с другими структурами базы данных, текст процедуры можно записать в файл и выполнить ее с помощью Query Analyzer. В первый раз, когда записывается процедура в текстовый файл, она начинается ключевыми словами CREATE PROCEDURE. Потом, если возникнет необходимость изменить процедуру, надо поменять эти слова на ALTER PROCEDURE.
Можно также создать процедуру в программе Enterprise Management, щелкнув правой кнопкой мыши на значке Stored procedure и в контекстном меню выбрав New Stored Procedure.
SQL можно также встраивать в прикладные программы. Иногда для наполнения данными внешнего представления необходимо использовать несколько SQL-операторов. Прикладная программа передает операторы на выполнение СУБД и затем отображает результаты в полях формы. Кроме того, прикладная программа должна обрабатывать и координировать действия пользователя при работе с формой – например, наполнение раскрывающегося списка и внесение необходимых изменений во внешние ключи для создания связей.
Конкретные аспекты встраивания SQL-кода в прикладные программы зависят от используемых языка программирования и технологии манипулирования данными.