Поделиться через


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

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

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

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

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

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

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

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

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

Существующие DLL-библиотеки, которые зарегистрированы без указания полного пути, перестанут работать после обновления до 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.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 casesp_addextendedproc 'xp_Hello', 'c:\xp_hello.dll'--Use the newly registered name to call the functionDECLARE @txt varchar(33)EXEC xp_Hello @txt OUTPUT--This is the error messageServer: Msg 17750, Level 16, State 1, Procedure xp_Hello, Line 1Could 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_helloDECLARE @txt varchar(33)EXEC xp_Hello @txt OUTPUTDECLARE @txt varchar(33)EXEC xp_HelLO @txt OUTPUTDECLARE @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 errorDECLARE @txt varchar(33)EXEC xp_HELLO @txt OUTPUT--This is the errorServer: Msg 2812, Level 16, State 62, Line 1

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