Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вся метода 3 (2).doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

Временные хранимые процедуры

Временная хранимая процедура похожа на локальную, однако она существует лишь до закрытия соединения, в котором создана, или до завершения работы SQL Server. В зави­симости от типа такая процедура удаляется после завершения работы сервера или разрыва соединения. Непостоянство обусловлено тем, что временные хранимые процедуры нахо­дятся в базе данных TempDB. При каждом запуске сервера эта база создается заново, по­этому после закрытия сервера все объекты этой базы данных исчезают. Временные храни­мые процедуры полезны при работе с более ранними версиями SQL Server, которые не поддерживают повторное использование планов исполнения, а также в тех случаях, когда нет смысла сохранять процедуру, поскольку значения ее параметров постоянно меняются. Существует три типа временных хранимых процедур: локальные (или закрытые), глобаль­ные и создаваемые непосредственно в TempDB. Локальная процедура всегда начинается с символа #, а глобальная — с ##. Создание каждого типа временных хранимых процедур описано в занятии 2. При исполнении временной хранимой процедуры ее область дей­ствия ограничена соединением, в котором она создана. Однако такая процедура видима всем пользователям, установившим соединение с базой данных, в окне Object Browser в Query Analyzer. Ограниченность области ее действия исключает возникновение конфликтов имен с другими соединениями, в которых созданы временные хранимые процедуры. Чтобы гарантировать уникальность имени временной хранимой процедуры, SQL Server добавляет к нему набор символов подчеркивания и уникальный номер соединения. Привилегии для локальной процедуры не предоставляются другим пользователям. Временная хранимая про­цедура удаляется из TempDB при закрытии соединения, в котором она создана.

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

Временные хранимые процедуры, которые создаются непосредственно в TempDB, от­личаются от локальных и глобальных процедур следующим:

  • для них разрешается настроить права доступа;

  • они сохраняются даже после завершения соединения, в котором созданы;

  • они не удаляются до завершения работы SQL Server.

Поскольку процедуры этого типа создаются непосредственно в TempDB, важно полностью определять имя объекта базы данных в коде Transact-SQL. Например, на таблицу Authors из базы данных Pubs, принадлежащую dbo, следует ссылаться по имени pubs.dbo.authors.

Расширенные хранимые процедуры

Расширенные хранимые процедуры обращаются к внешним программам, скомпилирован­ным в виде 32-разрядных DLL. Некоторые системные хранимые процедуры также рассматриваются как расширенные. Например, хранимая процедура xp_sendmail, которая посылает по заданному адресу почтовое сообщение с вложенным результирующим набором, является системной и расширенной одновременно. Соглашение об именовании предполагает исполь­зование в именах расширенных хранимых процедур префикса хр_. Однако имена некоторых расширенных процедур начинаются с префикса sp_, а в именах некоторых других, не расширенных процедур используется префикс хр_. Поэтому нельзя различить системные и расширенные хранимые процедуры, полагаясь лишь на отличия в именах.

Определить, является ли хранимая процедура расширенной, позволяет функция ОВ-JECTPROPERTY. Она возвращает для свойства IsExtendedProc значение 1, если процедура является расширенной, или 0, если процедура таковой не является. Следующие приме­ры демонстрируют, как можно выяснить, что процедура sp_prepare — расширенная, а хр logininfo — нет:

USE Master

— Расширенная хранимая процедура с префиксом sp_.

SELECT OBJECTPROPERTY(object_id('sp_prepare'), 'IsExtendedProc')

Этот пример возвращает значение 1. USE Master

  • Хранимая процедура, которая не является расширенной,

  • но имеет префикс хр_

SELECT OBJECTPROPERTY(objectjd('xp_logininfo'), 'IsExtendedProc')

Этот пример возвращает значение 0.