Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
Это важно
Эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется. Используйте интеграцию с CLR вместо этого.
Как работают расширенные хранящиеся процедуры
Процесс, по которому работает расширенная сохранённая процедура, следующий:
Когда клиент выполняет расширенную сохранённую процедуру, запрос передаётся в табличном потоке данных (TDS) или в формате Simple Object Access Protocol (SOAP) из клиентского приложения на SQL Server.
SQL Server ищет DLL, связанную с расширенной сохранённой процедурой, и загружает DLL, если она ещё не загружена.
SQL Server вызывает запрошенную расширенную хранящую процедуру (реализованную как функция внутри DLL).
Расширенная сохранённая процедура передаёт наборы результатов и возвращает параметры обратно на сервер через API расширенной хранящейся процедуры.
Ранее Open Data Services использовались для написания серверных приложений, таких как шлюзы к не-SQL Server базам данных. SQL Server не поддерживает устаревшие части API Open Data Services. Единственной частью оригинального API Open Data Services, всё ещё поддерживаемой SQL Server, являются расширенные функции хранения процедур, поэтому API был переименован в Extended Stored Procedure API.
С появлением распределённых запросов и интеграции с CLR потребность в приложениях Extended Stored Procedure API в значительной степени была заменена.
Если у вас уже есть шлюзовые приложения, вы не сможете использовать тех, opends60.dll что идут в комплекте с SQL Server, для запуска приложений. Приложения шлюзов больше не поддерживаются.
Расширенные хранимые процедуры против интеграции с CLR
Интеграция с CLR предоставляет более надёжную альтернативу написанию серверной логики, которую было трудно выразить или написать невозможно в Transact-SQL. В более ранних версиях SQL Server расширенные хранимые процедуры (XP) были единственным механизмом, доступным разработчикам приложений баз данных для написания такого кода.
При интеграции с CLR логика, ранее написанная в виде хранимых процедур, часто лучше выражается в виде таблицных функций, которые позволяют запросить результаты, построенные функцией, в SELECT операторы, встраивая их в клаузу FROM .
Для получения дополнительной информации смотрите обзор интеграции CLR.
Характеристики выполнения расширенных хранимых процедур
Выполнение расширенной хранимой процедуры имеет следующие характеристики:
Функция расширенной хранимой процедуры выполняется в контексте безопасности SQL Server.
Расширенная функция хранящейся процедуры выполняется в процессном пространстве SQL Server.
Поток, связанный с выполнением расширенной сохранённой процедуры, является тем же, что используется для клиентского соединения.
Это важно
Перед добавлением расширенных хранимых процедур на сервер и предоставлением разрешений на выполнение другим пользователям системный администратор должен тщательно проверить каждую расширенную хранящую процедуру, чтобы убедиться, что она не содержит вредоносного или вредоносного кода.
После загрузки расширенной сохранённой процедуры DLL DLL остаётся загруженной в адресном пространстве сервера до тех пор, пока SQL Server не будет остановлен или администратор явно не разгрузит DLL с помощью DBCC <DLL_name> (FREE).
Расширенная сохранённая процедура может быть выполнена из Transact-SQL как сохранённая процедура, используя оператор:EXECUTE
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;
Параметры
@ ретвал
Возвратное значение.
@ param1
Входной параметр.
@ param2
Параметр ввода/вывода.
Caution
Расширенные хранящиеся процедуры повышают производительность и расширяют функциональность SQL Server. Однако, поскольку расширенная сохранённая процедура DLL и SQL Server используют одно и то же адресное пространство, процедура проблемы может негативно повлиять на работу SQL Server. Хотя исключения, создаваемые расширенной хранящейся процедурой DLL, обрабатываются SQL Server, возможно повредить области с данными SQL Server. В целях безопасности только системные администраторы SQL Server могут добавлять расширенные хранимые процедуры в SQL Server. Эти процедуры следует тщательно протестировать перед установкой.
Отправьте наборы результатов на сервер с расширенным хранимым процедурным API
При отправке набора результатов на SQL Server расширенная сохранённая процедура должна вызывать соответствующий API следующим образом:
srv_sendmsgФункция может быть вызвана в любом порядке до или после того, как все строки (если таковые есть) находятся сsrv_sendrow. Все сообщения должны быть отправлены клиенту до отправки статуса завершения с .srv_senddoneФункция вызывается один раз для каждой строки,
srv_sendrowотправленной клиенту. Все строки должны быть отправлены клиенту до того, как любые сообщения, значения статуса или статусы завершения будут отправлены сsrv_sendmsg, аргументомsrv_statussrv_pfield, илиsrv_senddone.Отправка строки, в которой не все столбцы определены,
srv_describeприводит к тому, что приложение появляется информационным сообщением об ошибке и возвращаетсяFAILклиенту. В данном случае рядок не отправляется.
Создание расширенных хранимых процедур
Расширенная сохранённая процедура — это функция C/C++ с прототипом:
SRVRETCODE xp_extendedProcName (SRVPROC *);
Использование префикса xp_ необязательно. Расширенные имена сохранённых процедур чувствительны к регистру при ссылке в Transact-SQL операторах, независимо от порядка кодовой страницы/сортировки, установленного на сервере. Когда вы создаёте DLL:
Если нужна точка входа, запишите
DllMainфункцию.Эта функция является необязательной. Если не указать это в исходном коде, компилятор ссылается на свою версию, которая только возвращает
TRUE. Если вы предоставляете функциюDllMain, операционная система вызывает её, когда поток или процесс присоединяется к DLL или отсоединяется от неё.Все функции, вызываемые вне DLL (все расширенные хранимые процедуры, Efunctions) должны быть экспортированы.
Вы можете экспортировать функцию, указав её имя в
EXPORTSразделе.defфайла, или добавить к названию функции в исходном коде ,__declspec(dllexport)расширение компилятора Microsoft (__declspec()начинается с двух подчеркнутых).
Эти файлы необходимы для создания расширенной сохранённой процедуры DLL.
| Файл | Description |
|---|---|
srv.h |
Расширенный заголовочный файл API Сохранённой Процедуры |
opends60.lib |
Импортная библиотека для opends60.dll |
Для создания расширенной хранимой процедуры DLL создайте проект типа Dynamic Link Library. Для получения дополнительной информации о создании DLL см. документацию среды разработки.
Все расширенные хранимые процедурные DLL должны реализовывать и экспортировать следующую функцию:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
__declspec(dllexport) — это специализированное для Microsoft расширение компилятора. Если ваш компилятор не поддерживает эту директиву, вам следует экспортировать эту функцию в файле DEF в разделе.EXPORTS
Когда SQL Server запускается с флагом -T260 трассировки или если пользователь с правами системного администратора запускается DBCC TRACEON (260), и если расширенная сохранённая процедура DLL не поддерживается __GetXpVersion(), в журнал ошибок выводится следующее предупреждение (__GetXpVersion() начинается с двух подчёркиваний).
Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().
Если расширенная хранимая процедура DLL экспортирует __GetXpVersion(), но версия, возвращаемая функцией, меньше требуемой версии сервера, в журнал ошибок печатается предупреждение с указанием версии, возвращаемой функцией, и версией, ожидаемой сервером. Если вы получаете это сообщение, значит, вы возвращаете неправильное значение из __GetXpVersion(), или компилируете с более старой версией srv.h.
Замечание
SetErrorMode, функция Win32, не должна вызываться в расширенных хранимых процедурах.
Долгосрочные расширенные хранимые процедуры должны вызываться srv_got_attention периодически, чтобы процедура могла завершиться в случае разрыва соединения или прерванного пакета.
Для отладки расширенной сохранённой процедуры DLL скопируйте её в каталог SQL Server \Binn . Чтобы указать исполняемый файл для сессии отладки, введите путь и имя файла исполняемого файла SQL Server (например, C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Для информации о sqlservr аргументах см. приложение sqlservr.
Добавить расширенную хранящую процедуру в SQL Server
DLL, содержащая расширенные функции хранения процедур, действует как расширение SQL Server. Чтобы установить DLL, скопируйте файл в каталог, например, ту, что содержит стандартные файлы SQL Server DLL (C:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn по умолчанию).
После копирования расширенной сохранённой процедуры DLL на сервер системный администратор SQL Server должен зарегистрировать в SQL Server каждую расширенную сохранённую функцию процедуры в DLL. Это реализуется с помощью sp_addextendedproc системной сохранённой процедуры.
Это важно
Системный администратор должен тщательно изучить расширенную хранящую процедуру, чтобы убедиться, что она не содержит вредоносного или вредоносного кода, прежде чем добавлять её на сервер и предоставлять разрешения на выполнение другим пользователям. Проверяйте все данные, вводимые пользователем. Не объединяйте пользовательский ввод до проверки. Никогда не выполняйте команду, построенную на основании непроверенных пользовательских входных данных.
Первый параметр задаёт sp_addextendedproc имя функции, а второй — имя DLL, в котором находится эта функция. Вам следует указать полный путь DLL.
Замечание
Существующие DLL, которые не были зарегистрированы с полным путём, не работают после обновления до SQL Server 2005 (9.x) или более поздней версии. Чтобы исправить проблему, используйте 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\MSSQL13.0.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;
Ниже приведено сообщение об ошибке:
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 example succeeds 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 example results in an error
DECLARE @txt VARCHAR(33);
EXEC xp_HELLO @txt OUTPUT;
Ниже приведено сообщение об ошибке:
Server: Msg 2812, Level 16, State 62, Line 1
Вам не нужно останавливаться и перезагружать SQL Server.
Запрос по расширенным хранимым процедурам, установленным в SQL Server
Аутентифицированный пользователь SQL Server может отображать в данный момент определённые расширенные хранимые процедуры и имя DLL, к которому каждая из них принадлежит, запустив системную sp_helpextendedproc процедуру. Например, следующий пример возвращает DLL, к которому xp_hello принадлежит:
sp_helpextendedproc 'xp_hello';
Если sp_helpextendedproc выполняется без указания расширенной хранимой процедуры, отображаются все расширенные хранимые процедуры и их DLL.
Удалите расширенную хранящую процедуру из SQL Server
Чтобы убрать каждую расширенную сохранённую процедурную функцию в пользовательски определённую расширенную сохранённую процедуру DLL, системный администратор SQL Server должен выполнить sp_dropextendedproc системную хранящуюся процедуру, указав имя функции и имя DLL, в котором она находится. Например, эта команда удаляет функцию xp_hello, расположенную в DLL, названной xp_hello.dll, из SQL Server:
sp_dropextendedproc 'xp_hello';
sp_dropextendedproc Не отбрасывает системные расширенные хранимые процедуры. Вместо этого системный администратор должен отказать EXECUTE в разрешении на расширенную хранящую процедуру публичной роли.
Разгрузка расширенной сохранённой процедуры DLL
SQL Server загружает расширенную хранимую процедуру DLL сразу после вызова одной из функций DLL. DLL остаётся загруженным до тех пор, пока сервер не будет отключён или до тех пор, пока системный администратор не использует оператор DBCC для его разгрузки. Например, эта команда разгружает xp_hello.dll, позволяя системному администратору скопировать более новую версию этого файла в каталог без отключения сервера:
DBCC xp_hello(FREE);
Связанный контент
- Интеграция среды CLR
- CLR Table-Valued функции
- Расширенные процедуры хранения движка баз данных — программирование
- Запросы к расширенным хранимым процедурам, установленным в SQL Server
- srv_got_attention (API расширенной хранящейся процедуры)
- sp_addextendedproc (Transact-SQL)
- sp_dropextendedproc (Transact-SQL)
- sp_helpextendedproc (Transact-SQL)
- DBCC dllname (БЕСПЛАТНО) (Transact-SQL)