Добавление на SQL Server расширенной хранимой процедуры

Важное примечаниеВажно!

В будущей версии Microsoft SQL Server эта возможность будет удалена. Не используйте ее при работе над новыми приложениями и как можно быстрее измените приложения, в которых она в настоящее время используется. Пользуйтесь вместо этого интеграцией со средой CLR.

DLL-библиотека, которая содержит функции расширенных хранимых процедур, используется как расширение SQL Server. Чтобы установить DLL-библиотеку, скопируйте файл в каталог, например в каталог, содержащий стандартные DLL-файлы SQL Server (по умолчанию «C:\Program Files\Microsoft SQL Server\MSSQL10_50.x\MSSQL\Binn»).

После копирования DLL-библиотеки расширенной хранимой процедуры на сервер, системному администратору SQL Server следует зарегистрировать в SQL Server каждую из функций расширенной хранимой процедуры в DLL-библиотеке. Это выполняется с помощью системной хранимой процедуры sp_addextendedproc.

Примечание по безопасностиПримечание по безопасности

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

Первый параметр sp_addextendedproc указывает имя функции, а второй параметр указывает имя DLL-библиотеки, в которой размещается функция. Рекомендуется указывать полный путь DLL.

Важное примечаниеВажно!

Существующие DLL-библиотеки, которые не зарегистрированы с полным путем, перестанут работать после обновления до SQL Server 2005. Для решения этой проблемы воспользуйтесь хранимой процедурой sp_dropextendedproc для отмены регистрации DLL-библиотеки, а затем выполните их повторную регистрацию процедурой sp_addextendedproc, указывая полный путь доступа.

Имя функции, передаваемое хранимой процедуре sp_addextendedproc, должно полностью совпадать с именем функции в DLL-библиотеке, включая регистр символов. Например, следующая команда регистрирует функцию xp_hello, расположенную в DLL-библиотеке с именем xp_hello.dll, в качестве расширенной хранимой процедуры SQL Server:

sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\xp_hello.dll'

Если имя функции, указанное в процедуре sp_addextendedproc, не соответствует в точности имени функции в DLL-библиотеке, новое имя будет зарегистрировано в SQL Server, но это имя будет непригодно для использования. Например, хотя xp_Hello зарегистрирована как расширенная хранимая процедура SQL Server, находящаяся в файле xp_hello.dll, SQL Server не сможет найти такую функцию в DLL-библиотеке при использовании имени xp_Hello для вызова функции в будущем.

--Register the function (xp_hello) with an initial upper case
sp_addextendedproc 'xp_Hello', 'c:\xp_hello.dll'

--Use the newly registered name to call the function
DECLARE @txt varchar(33)
EXEC xp_Hello @txt OUTPUT

--This is the error message
Server: Msg 17750, Level 16, State 1, Procedure xp_Hello, Line 1
Could not load the DLL xp_hello.dll, or one of the DLLs it references. Reason: 127(The specified procedure could not be found.).

Если имя функции, указанное в sp_addextendedproc, точно соответствует имени функции в DLL-библиотеке, а в параметрах сортировки экземпляра SQL Server не учитывается регистр, пользователь может вызвать расширенную хранимую процедуру с использованием любого сочетания символов нижнего и верхнего регистров в ее имени.

--Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll'

--The following will succeed in calling xp_hello
DECLARE @txt varchar(33)
EXEC xp_Hello @txt OUTPUT

DECLARE @txt varchar(33)
EXEC xp_HelLO @txt OUTPUT

DECLARE @txt varchar(33)
EXEC xp_HELLO @txt OUTPUT

Если в параметрах сортировки экземпляра SQL Server учитывается регистр, SQL Server не сможет вызвать расширенную хранимую процедуру, даже если она была зарегистрирована точно с тем же именем и параметрами сортировки, как функция в DLL-библиотеке, если при вызове процедуры ее имя указано в другом регистре символов.

--Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll'

--The following will result in an error
DECLARE @txt varchar(33)
EXEC xp_HELLO @txt OUTPUT

--This is the error
Server: Msg 2812, Level 16, State 62, Line 1

Останавливать и перезапускать SQL Server не обязательно.