Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Důležité
Tato funkce bude odebrána v budoucí verzi SQL Serveru. Nepoužívejte tuto funkci v nové vývojové práci a naplánujte úpravu aplikací, které tuto funkci aktuálně používají. Použijte místo toho integraci CLR .
Jak fungují rozšířené uložené procedury
Proces, kterým funguje rozšířená uložená procedura, je:
Když klient spustí rozšířenou uloženou proceduru, požadavek je přenášen v tabulárním datovém toku (TDS) nebo ve formátu Simple Object Access Protocol (SOAP) z klientské aplikace do SQL Serveru.
SQL Server vyhledává DLL spojené s rozšířenou uloženou procedurou a načte DLL, pokud ještě není načteno.
SQL Server volá požadovanou rozšířenou uloženou proceduru (implementovanou jako funkce uvnitř DLL).
Rozšířená uložená procedura předává výsledky a vrací parametry zpět serveru prostřednictvím API Extended Stored Procedure.
V minulosti byly Open Data Services používány k psaní serverových aplikací, například bran do databázových prostředí mimo SQL Server. SQL Server nepodporuje zastaralé části API Open Data Services. Jedinou částí původního API Open Data Services, kterou SQL Server stále podporoval, jsou rozšířené funkce uložených procedur, proto bylo API přejmenováno na Extended Stored Procedure API.
S nástupem distribuovaných dotazů a integrací CLR byla potřeba aplikací Extended Stored Procedure API z velké části nahrazena.
Pokud máte stávající gateway aplikace, nemůžete použít ty opends60.dll , které jsou dodávány se SQL Serverem, k jejich spuštění aplikací. Brány již nejsou podporovány.
Rozšířené uložené procedury vs. integrace CLR
Integrace CLR poskytuje robustnější alternativu k psaní serverové logiky, která byla buď obtížně vyjádřitelná, nebo nemožná napsat v Transact-SQL. V dřívějších verzích SQL Serveru poskytovaly rozšířené uložené procedury (XP) jediný mechanismus, který byl vývojářům databázových aplikací dostupný pro psaní takového kódu.
Při integraci CLR je logika, která byla dříve psána ve formě uložených procedur, často lépe vyjádřena jako tabulkové funkce, které umožňují dotazovat výsledky vytvořené funkcí ve SELECT výkazech vložením do klauzule FROM .
Pro více informací viz přehled integrace CLR.
Charakteristiky provádění rozšířených uložených procedur
Provádění rozšířené uložené procedury má tyto charakteristiky:
Rozšířená funkce uložených procedur je vykonávána v bezpečnostním kontextu SQL Serveru.
Rozšířená funkce uložených procedur běží v procesním prostoru SQL Serveru.
Vlákno spojené s vykonáním rozšířené uložené procedury je stejné jako vlákno používané pro připojení ke klientovi.
Důležité
Před přidáním rozšířených uložených procedur na server a udělením povolení k vykonávání ostatním uživatelům by měl správce systému důkladně zkontrolovat každou rozšířenou uloženou proceduru, aby se ujistil, že neobsahuje škodlivý nebo škodlivý kód.
Po načtení rozšířené uložené procedury DLL zůstává DLL načtena v adresním prostoru serveru, dokud SQL Server není zastaven nebo dokud administrátor explicitně neodloží DLL pomocí .DBCC <DLL_name> (FREE)
Rozšířenou uloženou proceduru lze spustit z Transact-SQL jako uloženou proceduru pomocí příkazu EXECUTE :
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;
Parametry
@ Retval
Návratová hodnota.
@ param1
Vstupní parametr.
@ param2
Vstupní/výstupní parametr.
Upozornění
Rozšířené uložené procedury nabízejí zlepšení výkonu a rozšiřují funkčnost SQL Serveru. Nicméně, protože rozšířené uložené procedury DLL a SQL Server sdílejí stejný adresní prostor, může problémová procedura negativně ovlivnit fungování SQL Serveru. Ačkoli výjimky způsobené rozšířenou uloženou procedurou DLL jsou zpracovávány SQL Serverem, je možné poškodit datové oblasti SQL Serveru. Jako bezpečnostní opatření mohou do SQL Serveru přidávat rozšířené uložené procedury pouze administrátoři SQL Serveru. Tyto postupy by měly být důkladně otestovány před instalací.
Odesílejte sady výsledků serveru pomocí API Extended Stored Procedure
Při odeslání výsledné sady do SQL Serveru by rozšířená uložená procedura měla volat příslušné API následovně:
Funkce
srv_sendmsgmůže být volána v libovolném pořadí před nebo po všech řádcích (pokud nějaké jsou) s .srv_sendrowVšechny zprávy musí být klientu odeslány před odesláním stavu dokončení ssrv_senddone.Funkce
srv_sendrowse volá jednou pro každý řádek zaslaný klientovi. Všechny řádky musí být odeslány klientovi před odesláním jakýchkoli zpráv, stavových hodnot nebo stavů dokončení ssrv_sendmsg, argumentemsrv_statussrv_pfield, nebosrv_senddone.Odeslání řádku, který nemá všechny sloupce definované s ,
srv_describezpůsobí, že aplikace zobrazí informační chybovou zprávu a vrátí seFAILklientovi. V tomto případě řádek není odeslán.
Vytvořte rozšířené uložené procedury
Rozšířená uložená procedura je funkce C/C++ s prototypem:
SRVRETCODE xp_extendedProcName (SRVPROC *);
Použití předpony xp_ je volitelné. Rozšířená jména uložených procedur jsou rozlišující velká písmena, pokud jsou odkazována v Transact-SQL příkazech, bez ohledu na kódovou stránku nebo pořadí třídění nainstalované na serveru. Když si vytvoříte DLL:
Pokud je vstupní bod nutný, napište funkci.
DllMainTato funkce je volitelná. Pokud ji neposkytnete ve zdrojovém kódu, kompilátor odpojí svou vlastní verzi, která nic jiného než vrátí
TRUE. Pokud zadáteDllMainfunkci, operační systém ji volá, když se vlákno nebo proces připojí nebo odpojí od DLL.Všechny funkce volané mimo DLL (všechny rozšířené uložené procedury Efunctions) musí být exportovány.
Funkci můžete exportovat tak, že její název uvedete v
EXPORTSsekci souboru.def, nebo můžete předepsat název funkce ve zdrojovém kódu s__declspec(dllexport), což je rozšíření kompilátoru Microsoft (__declspec()začíná dvěma podtržítky).
Tyto soubory jsou nezbytné pro vytvoření rozšířené uložené procedury DLL.
| File | Description |
|---|---|
srv.h |
Soubor hlavičky API Extended Stored Procedure |
opends60.lib |
Importovat knihovnu pro opends60.dll |
Pro vytvoření rozšířeného uloženého procedurálního DLL vytvořte projekt typu Dynamic Link Library. Pro více informací o vytvoření DLL viz dokumentaci vývojového prostředí.
Všechny DLL s rozšířenými uloženými procedurami by měly implementovat a exportovat následující funkci:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
__declspec(dllexport) je rozšíření kompilátoru specifické pro Microsoft. Pokud váš kompilátor tuto direktivu nepodporuje, měli byste tuto funkci exportovat do DEF souboru v sekci.EXPORTS
Když je SQL Server spuštěn s příznakem -T260 trace nebo pokud uživatel s oprávněními správce systému spustí DBCC TRACEON (260), a pokud rozšířená uložená procedura DLL nepodporuje __GetXpVersion(), do chybového logu se vypíše následující varovná zpráva (__GetXpVersion() začíná dvěma podtržítky).
Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().
Pokud rozšířená uložená procedura DLL exportuje __GetXpVersion(), ale verze vrácená funkcí je menší než verze požadovaná serverem, do chybového logu se vypíše varovná zpráva uvádějící verzi vrácenou funkcí a verzi očekávanou serverem. Pokud dostanete tuto zprávu, vracíte nesprávnou hodnotu z __GetXpVersion(), nebo kompilujete se starší verzí .srv.h
Poznámka:
SetErrorMode, funkce Win32, by neměla být volána v rozšířených uložených procedurách.
Dlouhodobě běžící rozšířené uložené procedury by měly volat srv_got_attention pravidelně, aby se procedura mohla sama ukončit, pokud je spojení ukončeno nebo je batch přerušen.
Pro ladění rozšířené uložené procedury DLL jej zkopírujte do adresáře SQL Server \Binn . Pro určení spustitelného souboru pro ladění zadejte cestu a název souboru spustitelného souboru SQL Serveru (například C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Pro informace o sqlservr argumentech viz aplikace sqlservr.
Přidat rozšířenou uloženou proceduru do SQL Serveru
DLL obsahující rozšířené funkce uložených procedur funguje jako rozšíření SQL Serveru. Pro instalaci DLL zkopírujte soubor do adresáře, například do toho, který obsahuje standardní soubory SQL Server DLL (C:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn ve výchozím nastavení).
Po zkopírování rozšířené uložené procedury DLL na server musí správce SQL Serveru zaregistrovat každou rozšířenou funkci uložených procedur v DLL na SQL Server. To se provádí pomocí procedury uložené sp_addextendedproc v systému.
Důležité
Správce systému by měl důkladně zkontrolovat rozšířenou uloženou proceduru, aby se ujistil, že neobsahuje škodlivý nebo škodlivý kód, než ji přidá na server a udělí povolení k vykonávání ostatním uživatelům. Ověřte veškerý vstup uživatele. Nespojujte uživatelské vstupy před jejich ověřením. Nikdy nespouštět příkaz vytvořený z neplatného uživatelského vstupu.
První parametr určuje sp_addextendedproc název funkce a druhý parametr určuje název DLL, ve kterém tato funkce leží. Měl bys specifikovat kompletní cestu DLL.
Poznámka:
Existující DLL, které nebyly registrovány s kompletní cestou, po upgradu na SQL Server 2005 (9.x) nebo pozdější verzi nefungují. Pro opravu problému použijte sp_dropextendedproc odregistraci DLL a poté ji znovu zaregistrujte s sp_addextendedproc, určením úplné cesty.
Název funkce uvedené v musí sp_addextendedproc být přesně stejný, včetně případu, jako název funkce v DLL. Například tento příkaz registruje funkci xp_hello, umístěnou v dll jménem xp_hello.dll, jako rozšířenou uloženou proceduru SQL Serveru:
sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';
Pokud název funkce uvedené v se sp_addextendedproc přesně neshoduje s názvem funkce v DLL, nový název se zaregistruje v SQL Serveru, ale název není použitelný. Například ačkoliv xp_Hello je registrována jako rozšířená uložená procedura SQL Serveru umístěná v , xp_hello.dllSQL Server nemůže funkci najít v DLL, pokud ji později použijete xp_Hello k volání.
-- 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;
Tady je chybová zpráva:
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.).
Pokud název funkce uvedené v přesně sp_addextendedproc odpovídá názvu funkce v DLL a kolecování instance SQL Serveru je necitlivé na velká písmena, může uživatel volat rozšířenou uloženou proceduru libovolnou kombinací malých a velkých písmen jména.
-- 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;
Pokud je kolace instance SQL Serveru citlivá na velikost písmen, SQL Server nemůže volat rozšířenou uloženou proceduru, pokud je procedura volána s jiným případem. To platí i v případě, že byla registrována se stejným názvem a shodou jako funkce v 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;
Tady je chybová zpráva:
Server: Msg 2812, Level 16, State 62, Line 1
Nemusíte zastavovat a restartovat SQL Server.
Dotaz rozšířených uložených procedur instalovaných v SQL Serveru
Uživatel ověřený SQL Serverem může zobrazit aktuálně definované rozšířené uložené procedury a název DLL, ke kterým každá patří, spuštěním systémové procedury sp_helpextendedproc . Například následující příklad vrací DLL, ke kterému xp_hello patří:
sp_helpextendedproc 'xp_hello';
Pokud sp_helpextendedproc je vykonán bez specifikace rozšířeného uloženého postupu, zobrazí se všechny rozšířené uložené procedury a jejich DLL.
Odstraňte rozšířenou uloženou proceduru ze SQL Serveru
Pro zařazení každé rozšířené funkce uložených procedur do uživatelsky definované rozšířené uložené procedury DLL, musí správce SQL Serveru spustit systémovou proceduru sp_dropextendedproc , přičemž specifikuje název funkce a název DLL, ve kterém tato funkce sídlí. Například tento příkaz odstraní funkci xp_hello, která se nachází v DLL pojmenované xp_hello.dll, ze SQL Serveru:
sp_dropextendedproc 'xp_hello';
sp_dropextendedproc Nevyrušuje systémové rozšířené uložené procedury. Místo toho by měl správce systému odepřít EXECUTE povolení k rozšířené uložené procedurě veřejné roli.
Naložte rozšířenou uloženou proceduru DLL
SQL Server načítá rozšířenou uloženou proceduru DLL ihned po vyvolání jedné z funkcí DLL. DLL zůstává načtená, dokud není server vypnut nebo dokud správce systému nepoužije DBCC příkaz k jeho odpojení. Například tento příkaz naloží xp_hello.dll, což umožňuje správci systému zkopírovat novější verzi tohoto souboru do adresáře bez nutnosti vypnout server:
DBCC xp_hello(FREE);
Související obsah
- Integrace modulu CLR (Common Language Runtime)
- CLR Table-Valued Funkce
- Rozšířené uložené procedury databázového enginu – programování
- Dotazování rozšířených uložených procedur nainstalovaných v SQL Serveru
- srv_got_attention (Rozšířené API uložených procedur)
- sp_addextendedproc (Transact-SQL)
- sp_dropextendedproc (Transact-SQL)
- sp_helpextendedproc (Transact-SQL)
- DBCC dllname (ZDARMA) (Transact-SQL)