Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_po_BD.doc
Скачиваний:
20
Добавлен:
25.09.2019
Размер:
587.78 Кб
Скачать

29. Microsoft sql Server 2000. Создание и использование хранимых процедур и пользовательских функций.

Хранимые процедуры являются механизмом, с помощью которого можно создавать подпрограммы, работающие на сервере и управляемые его процессами. Подобные подпрограммы могут быть активизированы вызывающим их приложением. Кроме того, они могут быть вызваны правилами, поддерживающими целостность данных, или триггерами.

Хранимые процедуры очень полезны, поскольку они работают непосредственно на сервере. Применение подобных процедур очень хорошо укладывается в модель клиент/сервер. Так как система SQL Server управляет базами данных, она является лучшим местом для выполнения хранимых процедур, работающих с данными.

Хранимые процедуры могут возвращать значения. Внутри процедур можно выполнять сравнение вводимых пользователем значений с заранее установленной в системе информацией. Хранимые процедуры применяют в работе мощные аппаратные решения SQL Server. Они ориентированы на базы данных и тесно взаимодействуют с оптимизатором SQL Server. Это позволяет получить высокую производительность при обработке данных.

В хранимые процедуры можно передавать значения и получать посредством них результаты работы, совершенно не обязательно имеющие отношение к рабочей таблице. Хранимая процедура может вычислить результаты в процессе работы.

В самом общем случае хранимые процедуры обладают следующими преимуществами:

  • Высокая производительность. Является результатом расположения хранимых процедур на сервере. Сервер — как правило, более мощная машина, поэтому время выполнения процедуры на сервере значительно меньше, чем на рабочей станции. Кроме того, информация из базы данных и хранимая процедура находятся в одной и той же системе, поэтому на передачу записей по сети время практически не затрачивается. Хранимые процедуры имеют непосредственный доступ к базам данных, что делает работу с информацией очень быстрой.

  • Преимущество разработки системы в архитектуре клиент/сервер. Заключается в возможности раздельного создания программного обеспечения клиента и сервера. Это преимущество является ключевым при разработке, и благодаря ему можно значительно уменьшить время, необходимое для окончания проекта. Код, работающий на сервере, может разрабатываться отдельно от кода клиентской части. При этом компоненты серверной части могут совместно использоваться компонентами стороны клиента.

  • Уровень безопасности. Хранимые процедуры могут выступать в качестве инструмента улучшения безопасности. Можно создать хранимые процедуры, осуществляющие операции добавления, изменения, удаления и отображения списков, и, таким образом, получить контроль над каждым из аспектов доступа к информации.

  • Усиление правил сервера, работающих с данными. Это одна из самых важных причин применения интеллектуального ядра баз данных. Хранимые процедуры позволяют применять правила и другую логику, помогающую контролировать вводимую в систему информацию.

Хранимые процедуры, работающие в динамических инструкциях SQL, дают ряд преимуществ:

    • Хранимые процедуры компилируются при первом выполнении и сохраняются в системной таблице текущей базы данных. При компилировании они оптимизируются. При этом выбирается самый лучший способ доступа к информации таблицы. Подобная оптимизация учитывает реальное положение данных в таблице, доступные индексы, загрузку таблицы и т. д. Откомпилированные хранимые процедуры могут значительно улучшить производительность системы.

    • Хранимые процедуры могут быть выполнены либо на локальной машине, либо на удаленной системе SQL Server. Это дает возможность активизировать процессы на других машинах и работать не только с локальными базами данных, но и с информацией на нескольких серверах.

    • Прикладные программы, написанные на таком языке высокого уровня, как С или Visual Basic, могут также вызывать хранимые процедуры, что обеспечивает оптимальное решение по распределению нагрузки между программным обеспечением клиентской части и SQL Server.

Для создания хранимой процедуры применяется инструкция create procedure. По умолчанию, выполнить созданную процедуру может только владелец базы данных. Он же может изменить разрешение доступа и позволить другим пользователям работать с этой процедурой. Имя хранимой процедуры может быть длиной до 128 символов, включая символы # и ##.

Синтаксис определения процедуры:

CREATE PROCEDURE] имя_процедуры [; число]

[{@параметр тип__данных] [VARYING]

[= значение__по_умолчанию] [OUTPUT]

]

[, ... n]

[WITH

{

RECOMPILE |

ENCRYPTION |

RECOMPILE, ENCRYPTION

}

[FOR REPLICATION]

AS

инструкции_SQL

Рассмотрим некоторые параметры этой команды:

  • имя_процедуры — имя процедуры должно удовлетворять правилам для идентификаторов, его длина не может превышать 128 символов; для локальных временных процедур перед именем используется знак #, а для глобальных временных процедур — знаки ##

  • число — необязательное целое число, используемое для группировки нескольких процедур под одним именем

  • @ параметр тип_данных — список имен параметров процедуры с соответствующим типом данных для каждого; таких параметров может быть до 1024; в качестве значения параметра разрешается передавать null; могут использоваться все типы данных — никаких ограничений нет; в качестве выходного параметра (используется ключевое слово output или varying) можно использовать тип данных cursor

  • varying — ключевое слово, определяющее, что в качестве выходного параметра используется результирующий набор — только для типа cursor

  • значение_по_умолчанию — используется в случае, когда при вызове процедуры параметр пропущен; должно быть константой и может включать символы.маски (%, _, [] и ^) и значение null

  • with recompile — ключевые слова, показывающие, что SQL Server не будет записывать план процедуры в кэш, а будет создавать его каждый раз при выполнении

  • with encryption — ключевые слова, показывающие, что SQL Server будет зашифровывать процедуру перед записью в системную таблицу syscomments

  • for replication — ключевые слова, показывающие, что эта процедура создается только для репликации; несовместимы с ключевыми словами WITH RECOMPILE

  • as — начало определения текста процедуры

  • инструкции_SQL — любой набор допустимых инструкций SQL, ограниченный только максимальным размером хранимой процедуры — 128 Кб; недопустимыми являются следующие операторы:

CREATE DEFAULT CREATE TRIGGER

CREATE PROCEDURE

CREATE RULE CREATE VIEW

После создания процедуры достаточно ввести ее имя в командную строку или окно SQL Server Query Analyzer и выполнить как обычную инструкцию. Если вызов хранимой процедуры следует за выполнением других инструкций, для ее активизации необходимо применять команду EXEC[UTE] имя_процедуры (при вызове хранимой процедуры первой в последовательности команд можно опустить ключевое слово ехес в инструкции ехес имя_процедуры. Ее можно просто вызвать по имени, и она будет выполнена автоматически).

Поскольку хранимая процедура является полноценным компонентом базы данных, то, создать новую процедуру можно только для текущей базы данных. При работе в SQL Server Query Analyzer установление текущей базы данных выполняется с помощью оператора use, за которым следует имя базы данных, где должна быть создана хранимая процедура. Внутрь хранимой процедуры может быть помещена любая инструкция Transact-SQL, за исключением инструкции create.

После создания в системе хранимой процедуры SQL Server компилирует ее и проверяет выполняемые внутри нее подпрограммы. При возникновении каких-либо проблем процедура отвергается. Перед повторной трансляцией ошибки должны быть устранены. В SQL Server 7.0 используется отложенное распознавание имен (delayed name resolution), поэтому если хранимая процедура содержит обращение к другой, еще нереализованной процедуре выводится предупреждение, но вызов несуществующей процедуры все же сохранится.

Если оставить в системе обращение к неустановленной хранимой процедуре, при попытке ее выполнения пользователь получит сообщение об ошибке.

Хранимые процедуры — это очень мощный инструмент, но максимальной эффективности можно добиться, только сделав их динамическими. Разработчик должен иметь возможность передавать внутрь хранимой процедуры значения, с которыми она должна работать.

Основными принципами применения параметров в хранимых процедурах являются:

  • Для процедуры может быть определен один или несколько параметров

  • Параметры используются в качестве именованных мест хранения данных точно так же, как переменные в языках программирования, таких как С или Visual Basic

  • Имя параметра обязательно предваряется символом @

  • Имена параметров являются локальными в той процедуре, где они определены

  • Параметры служат для передачи информации в процедуру при ее выполнении. Они помещаются в командной строке после имени процедуры.

  • В случае, если процедура имеет несколько параметров, они разделяются запятыми.

  • Для определения типа информации, передаваемой в качестве параметра, применяют системные типы данных

В SQL Server имеется огромное количество системных хранимых процедур. Все они начинаются с префикса sp_ и находятся в базе данных master. Созданные процедуры хранятся в соответствующей базе данных. При вызове любой хранимой процедуры, имя которой начинается с префикса sp_, SQL Server всегда производит поиск процедуры в следующем порядке:

1. В базе данных master.

2. В базе данных, указанной при вызове.

3. В текущей базе данных.

Чем чревато присвоение своей хранимой процедуре имени, начинающегося с префикса sp_? Во-первых, увеличением времени ее поиска — как минимум, надо "пройтись" по базе данных master. Во-вторых, если случайно имя процедуры совпадет с именем системной, то результатов выполнения такой процедуры вы никогда не увидите, поскольку она будет замаскирована одноименной процедурой из базы данных master. Это следует иметь в виду при присвоении имен хранимым процедурам.

Просмотр определения процедуры выполняется с помощью системной процедуры sp_helptext, а системная процедура sp_help позволяет вывести контрольную информацию о ней. Системные процедуры sp_helptext и sp_help используются и для просмотра таких объектов баз данных, как таблицы, правила и установки по умолчанию.

В SQL Server Query Analyzer хранимая процедура удаляется с помощью инструкции DROP PROCEDURE. С помощью одной такой инструкции может быть удалено несколько процедур. Имена удаляемых процедур указываются через запятую после ключевого слова drop procedure. Синтаксис:

DROP PROCEDURE имя_процедуры_1 [, ..., имя_процедуры_п]

Несколько версий процедуры не могут быть удалены селективно. Все версии с одинаковым именем удаляются одновременно. При этом в инструкции drop procedure имя процедуры указывается без номера версии.

В SQL Server 7.0 появилась возможность изменять хранимые процедуры и с помощью Transact-SQL без их предварительного удаления. Для этого служит команда alter procedure, ее синтаксис:

ALTER PROC[EDURE] имя_процедуры [; число]

[{@параметр тип_данных} [= значение_ло_умолчанию] [OUTPUT]

]

[, ... л]

[ WITH

{

RECOMPILE |

ENCRYPTION |

RECOMPILE, ENCRYPTION

[ FOR REPLICATION]

AS

инструкции_ SQL

Структура и параметры инструкции alter procedure идентичны структуре и параметрам инструкции create procedure.

Компиляция хранимой процедуры

Преимущество применения хранимых процедур для выполнения набора инструкций Transact-SQL состоит в том, что они компилируются при первом выполнении. В процессе компиляции инструкции Transact-SQL конвертируются из их первоначального символьного представления в исполняемую форму. Любые объекты, к которым происходит обращение в процедуре, также конвертируются в альтернативное представление. Например, имена таблиц конвертируются в их идентификаторы объекта, а имена столбцов - в их идентификаторы столбцов.

План выполнения создается точно так же, как и для выполнения одной инструкции Transact-SQL. Этот план содержит, например, индексы, применяемые для считывания строк из таблиц, к которым обращается процедура. План выполнения процедуры сохраняется в кэше и используется при каждом ее вызове.

Автоматическая повторная компиляция

Обычно план выполнения находится в кэше процедур. Это позволяет увеличить производительность при его выполнении. Процедура, однако, автоматически перекомпилируется при следующих обстоятельствах:

  • Процедура всегда перекомпилируется при начале работы SQL Server. Обычно это происходит после перезагрузки операционной системы и при первом выполнении процедуры после создания.

  • План выполнения процедуры автоматически перекомпилируется всегда, когда удаляется индекс таблицы, к которому обращается процедура. Поскольку текущий план обращается для считывания строк таблицы к индексу, который уже не существует, следует создать новый план выполнения. Запросы процедуры будут выполняться только в том случае, если он будет обновлен.

  • Компиляция плана выполнения происходит и в случае, если с этим планом, находящимся в кэше, в настоящее время работает другой пользователь. Для второго пользователя создается индивидуальная копия плана выполнения. Если бы первая копия плана не была занята, не понадобилось бы создания второй копии. Когда пользователь завершает выполнение процедуры, план выполнения доступен в кэше другому пользователю, имеющему соответствующее разрешение доступа.

  • Процедура автоматически перекомпилируется, если она удаляется и заново создается. Все копии плана выполнения в кэше удаляются, так как новая процедура может отличаться от старой версии и необходим новый план.

Для установки автоматического выполнения процедуры при загрузке SQL Server используют системную хранимую процедуру sp_Makestartup. Можно определить любое количество процедур, которые будут автоматически выполняться в начале работы. Синтаксис процедуры sp_makestartup:

SP_MAKESTARTUP имя_процедуры

Автоматически выполняемые в начале работы SQL Server процедуры активизируются после открытия и восстановления всех баз данных. Для просмотра списка процедур, автоматически выполняемых в начале работы, применяют системную процедуру sp_helpstartup. Чтобы запретить процедуре выполняться автоматически, применяют системную процедуру SP_UNMAKESTARTUP.

Набор инструкций Transact-SQL называется пакетом. Пакет может включать и хранимые процедуры. Правила или синтаксис для применения инструкций Transact-SQL в пакете применяются к следующему списку объектов:

  • Процедуры

  • Правила

  • Установки по умолчанию

  • Триггеры

  • Представления

Синтаксис, в основном, состоит из набора ограничений, определяющих типы инструкций, используемых в пакетах. Большинство ограничений составляют инструкции, которые создают объекты, изменяющие базы данных или среду запросов или неработающие внутри текущего пакета. Правила и установки по умолчанию, например, могут быть определены внутри пакета и связаны со столбцом или пользовательским типом данных, но они работают лишь до тех пор, пока не завершится выполнение пакета. Нельзя в одном и том же пакете удалить объект, а затем обратиться к нему или заново его создать.

Ключевые слова if и else предназначены для контроля условного выполнения инструкций внутри хранимой процедуры. Они дают возможность проверять наличие определенного состояния и выполнять инструкцию, являющуюся частью ветви if, или инструкцию, являющуюся частью ветви else. Критерий проверки определяется выражением, следующим за ключевым словом if. Синтаксис инструкции if ... else:

IF выражение

инструкция

[ELSE]

[IF выражение

инструкция]

Ключевые слова begin и end применяются для обозначения набора инструкций Transact-SQL, который должен быть выполнен как один блок. Ключевое слово begin определяет начало блока инструкций, а ключевое слово end, находящееся после последней инструкции Transact-SQL в блоке, обозначает конец набора этих инструкций. Синтаксис:

BEGIN

инструкции

END

Ключевое слово while применяется для выполнения одного или нескольких инструкций Transact-SQL, при истинности заданного условия. Инструкция, следующая за while, выполняется циклически, пока проверяемое условие истинно. Синтаксис инструкции while:

WHILE <логическое_выражение>

<инструкция_SQL>

Ключевое слово break применяется внутри блока команд Transact-SQL, находящихся внутри условной инструкции while. Результатом выполнения предложения break будет переход к первому оператору, следующему за концом блока. Синтаксис ключевого слова break:

WHILE <логическое_выражение>

<инструкция_ SQL>

BREAK

<инструкция_SQL>

Ключевое слово continue применяется для формирования предложения внутри такой условной конструкции, как while, для прямого указания на необходимость продолжения выполнения набора инструкций, находящихся внутри этой условной конструкции. Синтаксис предложения continue:

WHILE <логическое_выражение>

<инструкция>

CONTINUE

<инструкция>

Выражение case применяется для селективного выбора на основании нескольких опций. Конструкция case даст возможность произвести тестирование входных данных, по результатам которого принимается решение о том, какое действие должно быть предпринято. Синтаксис выражения case:

CASE [ выражение ]

WHEN простое_выражение1 | логическое_выражение1 THEN выражение1

[ [WHEN простое_выражение2 | логическое_выражение2 THEN выражение2] [...]]

[ELSE выражениеN]

END

Если в выражении, следующем непосредственно за ключевым словом case, находится оператор сравнения, то это выражение называется поисковым (searched expression), а не простым выражением case. В поисковом выражении case может быть также применен логический оператор.

В простых выражениях case значение оператора, следующего сразу же за ключевым словом case, всегда точно совпадает со значением, находящимся после ключевого слова when.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]