Programmeringsdatabasmotor utökade lagrade procedurer

Gäller för:SQL Server

Viktigt!

Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen. Använd istället CLR-integration .

Hur utökade lagrade procedurer fungerar

Processen genom vilken en utökad lagrad procedur fungerar är:

  1. När en klient utför en utökad lagrad procedur skickas begäran i tabulär dataström (TDS) eller Simple Object Access Protocol (SOAP)-format från klientapplikationen till SQL Server.

  2. SQL Server söker efter DLL:n som är kopplad till den utökade lagrade proceduren och laddar DLL:n om den inte redan är inladdad.

  3. SQL Server anropar den begärda utökade lagrade proceduren (implementerad som en funktion i DLL).

  4. Den utökade lagrade proceduren skickar resultatuppsättningar och returnerar parametrar tillbaka till servern via Extended Stored Procedure API.

Tidigare användes Open Data Services för att skriva serverapplikationer, såsom gateways till databasmiljöer utanför SQL Server. SQL Server stöder inte de föråldrade delarna av Open Data Services API. Den enda delen av det ursprungliga Open Data Services API som fortfarande stöds av SQL Server är de utökade lagrade procedurfunktionerna, så API:et bytte namn till Extended Stored Procedure API.

Med framväxten av distribuerade frågor och CLR-integration har behovet av Extended Stored Procedure API-applikationer till stor del ersatts.

Om du har befintliga gateway-applikationer kan du inte använda de opends60.dll som följer med SQL Server för att köra applikationerna. Gateway-applikationer stöds inte längre.

Utökade lagrade procedurer vs. CLR-integration

CLR-integration ger ett mer robust alternativ till att skriva serverside-logik som antingen var svår att uttrycka eller omöjlig att skriva i Transact-SQL. I tidigare versioner av SQL Server utgjorde utökade lagrade procedurer (XP) den enda mekanism som fanns tillgänglig för databasapplikationsutvecklare att skriva sådan kod.

Med CLR-integration uttrycks logik som tidigare skrevs i form av lagrade procedurer ofta bättre som tabellvärda funktioner, vilka tillåter att resultaten konstruerade av funktionen kan frågas i SELECT satser genom att bädda in dem i klausulen FROM .

För mer information, se CLR-integrationsöversikt.

Exekveringsegenskaper för utökade lagrade procedurer

Exekveringen av en utökad lagrad projeder har dessa egenskaper:

  • Funktionen för utökad lagrad procedur körs under säkerhetskontexten SQL Server.

  • Funktionen för utökad lagrad procedur körs i processutrymmet i SQL Server.

  • Tråden som är kopplad till exekveringen av den utökade lagrade proceduren är densamma som används för klientanslutningen.

Viktigt!

Innan utökade lagrade procedurer läggs till servern och exekveringsbehörigheter ges till andra användare, bör systemadministratören noggrant granska varje utökad lagrad procedur för att säkerställa att den inte innehåller skadlig eller skadlig kod.

Efter att den utökade lagrade proceduren DLL har laddats, förblir DLL:n inläst i serverns adressutrymme tills SQL Server stoppas eller administratören uttryckligen avlastar DLL:n genom att använda DBCC <DLL_name> (FREE).

Den utökade lagrade proceduren kan utföras från Transact-SQL som en lagrad proprocedur genom att använda satsen EXECUTE :

EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;

Parameterar

@ Retval

Ett avkastningsvärde.

@ param1

En indataparameter.

@ param2

En in-/utgångsparameter.

Försiktighet

Utökade lagrade procedurer erbjuder prestandaförbättringar och utökar SQL Server-funktionaliteten. Eftersom den utökade lagrade proceduren DLL och SQL Server delar samma adressutrymme kan dock en problemprocedur påverka SQL Servers funktion negativt. Även om undantag som ges av den utökade lagrade proceduren DLL hanteras av SQL Server, är det möjligt att skada SQL Server-dataområden. Som en säkerhetsåtgärd kan endast SQL Server-systemadministratörer lägga till utökade lagrade procedurer i SQL Server. Dessa procedurer bör testas noggrant innan de installeras.

Skicka resultatuppsättningar till servern med Extended Stored Procedure API

När du skickar en resultatuppsättning till SQL Server ska den utökade lagrade proceduren anropa rätt API enligt följande:

  • Funktionen srv_sendmsg kan anropas i valfri ordning före eller efter att alla rader (om några) är med srv_sendrow. Alla meddelanden måste skickas till klienten innan slutförandestatusen skickas med srv_senddone.

  • Funktionen srv_sendrow anropas en gång för varje rad som skickas till klienten. Alla rader måste skickas till klienten innan några meddelanden, statusvärden eller kompletteringsstatusar skickas med srv_sendmsg, argumentet srv_status i srv_pfield, eller srv_senddone.

  • Att skicka en rad som inte har alla sina kolumner definierade med srv_describe får applikationen att skicka ett informationsfelmeddelande och återvända FAIL till klienten. I det här fallet skickas inte raden.

Skapa utökade lagrade procedurer

En utökad lagrad proprodur är en C/C++-funktion med en prototyp:

SRVRETCODE xp_extendedProcName (SRVPROC *);

Att använda prefixet xp_ är valfritt. Utökade lagrade procedurnamn är kasuskänsliga när de refereras i Transact-SQL satser, oavsett kodsida eller sorteringsordning installerad på servern. När du bygger en DLL:

  • Om en ingångspunkt är nödvändig, skriv en DllMain funktion.

    Denna funktion är frivillig. Om du inte tillhandahåller det i källkoden länkar kompilatorn sin egen version, vilket bara ger att returnera TRUE. Om du tillhandahåller en DllMain funktion anropar operativsystemet denna funktion när en tråd eller process ansluter till eller kopplas bort från DLL:n.

  • Alla funktioner som anropas utanför DLL:n (alla utökade lagrade procedur-efunktioner) måste exporteras.

    Du kan exportera en funktion genom att lista dess namn i EXPORTS filens sektion .def , eller så kan du prefixa funktionsnamnet i källkoden med __declspec(dllexport), en Microsoft-kompilator-tilläggsfunktion (__declspec() börjar med två understreck).

Dessa filer krävs för att skapa en utökad lagrad procedur DLL.

File Description
srv.h Utökad lagrad procedur API-headerfil
opends60.lib Importera bibliotek för opends60.dll

För att skapa en utökad lagrad procedur DLL, skapa ett projekt av typen Dynamic Link Library. För mer information om att skapa en DLL, se dokumentationen för utvecklingsmiljön.

Alla utökade lagrade procedur-DLL:er bör implementera och exportera följande funktion:

__declspec(dllexport) ULONG __GetXpVersion()
{
   return ODS_VERSION;
}

__declspec(dllexport) är en Microsoft-specifik kompilatortillägg. Om din kompilator inte stödjer detta direktiv bör du exportera denna funktion i din DEF fil under avsnittet EXPORTS .

När SQL Server startas med spårflaggan -T260 eller om en användare med systemadministratörsrättigheter kör DBCC TRACEON (260), och om den utökade lagrade proceduren som DLL inte stödjer __GetXpVersion(), skrivs följande varningsmeddelande ut i felloggen (__GetXpVersion() börjar med två understreck).

Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().

Om den utökade lagrade proceduren DLL exporterar __GetXpVersion(), men versionen som returneras av funktionen är mindre än den version som servern kräver, skrivs ett varningsmeddelande ut i felloggen som anger vilken version funktionen returnerar och den version som servern förväntar sig. Om du får detta meddelande returnerar du ett felaktigt värde från __GetXpVersion(), eller så kompilerar du med en äldre version av srv.h.

Anmärkning

SetErrorMode, en Win32-funktion, bör inte anropas i utökade lagrade procedurer.

Långvariga utökade lagrade procedurer bör anropas srv_got_attention periodiskt, så att proceduren kan avsluta sig själv om anslutningen bryts eller batchen avbryts.

För att felsöka en utökad lagrad procedur DLL, kopiera den till SQL Server-katalogen \Binn . För att specificera den körbara filen för felsökningssessionen, ange sökvägen och filnamnet för SQL Server-filen (till exempel C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). För information om sqlservr argument, se sqlservr Application.

Lägg till en utökad lagrad propuder i SQL Server

En DLL som innehåller utökade lagrade procedurfunktioner fungerar som en utbyggnad till SQL Server. För att installera DLL:n, kopiera filen till en katalog, till exempel den som innehåller standardfiler för SQL Server DLL-filer (C:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn som standard).

Efter att den utökade lagrade procedur-DLL har kopierats till servern måste en SQL Server-systemadministratör registrera varje utökad lagrad procedurfunktion i DLL:n till SQL Server. Detta görs med systemlagrad sp_addextendedproc procedur.

Viktigt!

Systemadministratören bör noggrant granska en utökad lagrad procedur för att säkerställa att den inte innehåller skadlig eller skadlig kod innan den läggs till på servern och ger exekveringsbehörigheter till andra användare. Verifiera alla användarindata. Sammanfoga inte användarinput innan du validerat den. Kör aldrig ett kommando som skapats med ovaliderade användarindata.

Den första parametern av sp_addextendedproc specificerar namnet på funktionen, och den andra parametern anger namnet på den DLL där funktionen finns. Du bör specificera hela vägen för DLL:n.

Anmärkning

Befintliga DLL-filer som inte var registrerade med en komplett sökväg fungerar inte efter uppgradering till SQL Server 2005 (9.x) eller en senare version. För att åtgärda problemet, använd sp_dropextendedproc för att avregistrera DLL:n och registrera sedan om den genom sp_addextendedproc, att specificera hela sökvägen.

Namnet på funktionen som anges i sp_addextendedproc måste vara exakt detsamma, inklusive fallet, som funktionens namn i DLL:n. Till exempel registrerar detta kommando en funktion xp_hello, som finns i en dll med namnet xp_hello.dll, som en SQL Server utökad lagrad procedur:

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

Om namnet på funktionen som anges i sp_addextendedproc inte exakt stämmer överens med funktionsnamnet i DLL:n, registreras det nya namnet i SQL Server, men namnet är inte användbart. Till exempel, även om xp_Hello är registrerad som en SQL Server utökad lagrad procedur belägen i xp_hello.dll, kan SQL Server inte hitta funktionen i DLL om du använder xp_Hello den för att anropa funktionen senare.

-- 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;

Här är felmeddelandet:

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.).

Om namnet på funktionen som specificeras i sp_addextendedproc exakt matchar funktionsnamnet i DLL:n, och sorteringen av SQL Server-instansen är kasuskänslig, kan användaren anropa den utökade lagrade proceduren med valfri kombination av gemener och versaler i namnet.

-- 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;

När sammansättningen av SQL Server-instansen är kasuskänslig kan SQL Server inte anropa den utökade lagrade proceduren om proceduren anropas med ett annat kasus. Detta gäller även om den var registrerad med exakt samma namn och sortering som funktionen i 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;

Här är felmeddelandet:

Server: Msg 2812, Level 16, State 62, Line 1

Du behöver inte stanna och starta om SQL Server.

Fråga om utökade lagrade procedurer installerade i SQL Server

En SQL Server-autentiserad användare kan visa de för närvarande definierade utökade lagrade procedurerna och namnet på den DLL som varje enhet tillhör genom att köra systemproceduren sp_helpextendedproc . Till exempel returnerar följande exempel den DLL som xp_hello tillhör:

sp_helpextendedproc 'xp_hello';

Om sp_helpextendedproc körs utan att specificera en utökad lagrad procedur visas alla utökade lagrade procedurer och deras DLL:er.

Ta bort en utökad lagrad procedur från SQL Server

För att släppa varje utökad lagrad procedurfunktion i en användardefinierad utökad lagrad procedur-DLL, måste en SQL Server-systemadministratör köra systemlagrad sp_dropextendedproc procedur och specificera namnet på funktionen och namnet på den DLL där funktionen finns. Till exempel tar detta kommando bort funktionen xp_hello, som finns i en DLL som är namngiven xp_hello.dll, från SQL Server:

sp_dropextendedproc 'xp_hello';

sp_dropextendedproc Släpper inte System Extended Stored Procedures. Istället bör systemadministratören neka EXECUTE tillstånd för den utökade lagrade proceduren till den offentliga rollen.

Avlasta en utökad lagrad procedur DLL

SQL Server laddar en utökad lagrad procedur-DLL så snart ett anrop görs till en av funktionerna i DLL:n. DLL:n förblir laddad tills servern stängs av eller tills systemadministratören använder satsen DBCC för att lasta av den. Till exempel avlastar xp_hello.dlldetta kommando , vilket tillåter systemadministratören att kopiera en nyare version av denna fil till katalogen utan att stänga ner servern:

DBCC xp_hello(FREE);