Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курс лекций СБД.doc
Скачиваний:
23
Добавлен:
13.11.2019
Размер:
1.94 Mб
Скачать
    1. Хранимые процедуры

Хранимая процедура (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-кода в прикладные программы зависят от используемых языка программирования и технологии манипулирования данными.