Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Fontos
Ez a funkció az SQL Server egy későbbi verziójában lesz eltávolítva. Ne használja ezt a funkciót az új fejlesztési munkában, és tervezze meg a funkciót jelenleg használó alkalmazások módosítását. Használj inkább CLR integrációt .
Hogyan működnek a kiterjesztett tárolt eljárások
A kiterjesztett tárolt eljárás működésének folyamata:
Amikor egy kliens egy kiterjesztett tárolt eljárást hajt végre, a kérést táblázatos adatfolyamban (TDS) vagy Simple Object Access Protocol (SOAP) formátumban továbbítják az ügyfélalkalmazástól az SQL Serverhez.
Az SQL Server keresi a kiterjesztett tárolt eljáráshoz tartozó DLL-t, és betölti a DLL-t, ha még nincs betöltve.
Az SQL Server a kért kiterjesztett tárolt eljárást hívja (amely a DLL-en belül egy függvényként valósított meg).
A kiterjesztett tárolt eljárás az eredményhalmazokat és a visszaküldési paramétereket a Extended Stored Procedure API-n keresztül továbbítja vissza a szervernek.
Korábban az Open Data Services szerveralkalmazások írásához használták, például átjárókat nem SQL Server adatbázis-környezetekbe. Az SQL Server nem támogatja az Open Data Services API elavult részeit. Az eredeti Open Data Services API-jának egyetlen része, amelyet az SQL Server még támogat, a kiterjesztett tárolt eljárásfüggvények, ezért az API-t átnevezték Extended Stored Procedure API-ra.
Az elosztott lekérdezések és a CLR integráció megjelenésével az Extended Stored Procedure API alkalmazások iránti igény nagyrészt felváltott.
Ha vannak meglévő átjáró alkalmazásaid, nem használhatod az opends60.dll SQL Serverrel együtt érkező alkalmazásokat az alkalmazások futtatásához. A gateway alkalmazásokat már nem támogatják.
Kiterjesztett tárolt eljárások vs. CLR integráció
A CLR integráció robusztenbb alternatívát kínál a szerveroldali logika írásához képest, amelyet a Transact-SQL-ben nehéz volt kifejezni, vagy lehetetlen volt írni. Az SQL Server korábbi kiadásaiban az kiterjesztett tárolt eljárások (XP-k) jelentettek az egyetlen mechanizmust, amely az adatbázis-alkalmazásfejlesztők számára elérhető volt az ilyen kód megírására.
A CLR integrációval a korábban tárolt eljárások formájában írt logikát gyakran jobban kifejezik táblázatértékű függvényekként, amelyek lehetővé teszik, hogy a függvény által generált eredményeket lekérdezésben SELECT lehessen kérni azáltal, hogy beágyazzák őket a FROM klauzulába.
További információért lásd: CLR integrációs áttekintés.
A kiterjesztett tárolt eljárások végrehajtási jellemzői
Egy kiterjesztett tárolt eljárás végrehajtása a következő jellemzőkkel rendelkezik:
A kiterjesztett tárolt eljárás függvényt az SQL Server biztonsági kontextusában hajtják végre.
A kiterjesztett tárolt eljárásfüggvény az SQL Server folyamattérében fut.
A kiterjesztett tárolt eljárás végrehajtásához kapcsolódó szál ugyanaz, mint amit a kliens kapcsolathoz használnak.
Fontos
Mielőtt kiterjesztett tárolt eljárásokat adna hozzá a szerverhez és más felhasználóknak is végrehajtó engedélyeket adna, a rendszergazdának alaposan át kell néznie minden kiterjesztett tárolt eljárást, hogy megbizonyosodjon arról, hogy nem tartalmaz-e káros vagy rosszindulatú kódot.
Miután a kiterjesztett tárolt eljárás DLL-e betöltik, a DLL a szerver címtérében marad, amíg az SQL Server meg nem áll, vagy az adminisztrátor kifejezetten le nem tölti a DLL-t a használatával DBCC <DLL_name> (FREE).
A kiterjesztett tárolt eljárás Transact-SQL-ből tárolt eljárásként végrehajtható a következő EXECUTE utasítással:
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;
Paraméterek
@ retval
Visszamegtérülési érték.
@ param1
Egy bemeneti paraméter.
@ Param2
Egy bemenet/kimeneti paraméter.
Caution
A kiterjesztett tárolt eljárások teljesítménynövekedést kínálnak és kibővítik az SQL Server funkcionalitását. Azonban mivel a kiterjesztett tárolt eljárás DLL és az SQL Server ugyanazon a címtéren osztoznak, egy problémaeljárás hátrányosan befolyásolhatja az SQL Server működését. Bár a kiterjesztett tárolt eljárás DLL-e által okozott kivételeket az SQL Server kezeli, előfordulhat, hogy az SQL Server adatterületei károsíthatók. Biztonsági óvintézkedésként csak az SQL Server rendszergazdái adhatnak kiterjesztett tárolt eljárásokat az SQL Serverhez. Ezeket az eljárásokat alaposan le kell vizsgálni a telepítés előtt.
Küldj eredményhalmazokat a szervernek az Extended Stored Procedure API-val
Amikor eredményhalmazt küldenek az SQL Servernek, a kiterjesztett tárolt eljárásnak a megfelelő API-t kell az alábbiak szerint hívnia:
A
srv_sendmsgfüggvényt bármilyen sorrendben hívhatjuk, mielőtt vagy utána minden sor (ha van) a .srv_sendrowMinden üzenetet el kell küldeni az ügyfélnek, mielőtt a befejezési státuszt elküldik .srv_senddoneA
srv_sendrowfüggvényt minden kliensnek küldött sorhoz egyszer hívják. Minden sort el kell küldeni az ügyfélnek, mielőtt bármilyen üzenetet, státuszértéket vagy befejezési státuszt küldenének ,srv_sendmsgazsrv_statussrv_pfieldargumentummal , vagysrv_senddone.Ha olyan sor küld, amelynek nincs minden oszlopa definiálva
srv_describe, az alkalmazás információs hibaüzenetet ad elő, és visszatérFAILaz ügyfélhez. Ebben az esetben a sor nem kerül elküldésre.
Hozz létre kiterjesztett tárolt eljárásokat
Egy kiterjesztett tárolt eljárás egy C/C++ függvény egy prototípussal:
SRVRETCODE xp_extendedProcName (SRVPROC *);
Az előtag xp_ használata opcionális. A kiterjesztett tárolt eljárásnevek nagybetűre érzékenyek, ha Transact-SQL utasításokban hivatkoznak rájuk, függetlenül attól, hogy a szerveren telepített kódlap/sorrend van. Amikor DLL-t építesz:
Ha belépési pont szükséges, írj egy
DllMainfüggvényt.Ez a funkció opcionális. Ha nem adod meg forráskódban, a fordító a saját verzióját linkel, ami csak visszaadja
TRUEa -t . Ha megadsz egyDllMainfüggvényt, az operációs rendszer akkor hívja ezt a függvényt, amikor egy szál vagy folyamat csatlakozik vagy leválik a DLL-ről.Minden függvényt, amelyet a DLL-en kívülről hívtak (minden kiterjesztett tárolt eljárás Efunction), exportálni kell.
Egy függvényt exportálhatsz úgy, hogy a fájl részében felsorolod a nevét
EXPORTS.def, vagy a forráskódban előtagolhatod a függvény nevét ,__declspec(dllexport)egy Microsoft fordító kiterjesztésével (__declspec()két aláhúzással kezdődik).
Ezek a fájlok szükségesek egy kiterjesztett tárolt eljárás DLL létrehozásához.
| File | Description |
|---|---|
srv.h |
Kiterjesztett Tárolt eljárás API fejlécfájl |
opends60.lib |
Könyvtár importálása opends60.dll |
Kiterjesztett tárolt eljárás DLL létrehozásához hozz létre egy Dynamic Link Library típusú projektet. További információért a DLL létrehozásáról lásd a fejlesztési környezet dokumentációját.
Minden kiterjesztett tárolt eljárás DLL-nek a következő funkciót kell megvalósítania és exportálnia:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
__declspec(dllexport) egy Microsoft-specifikus fordítóbővítmény. Ha a fordítód nem támogatja ezt az irányelvet, exportáld ezt a funkciót a DEF fájlodban a EXPORTS szekcióban.
Amikor az SQL Servert a trace zászlóval -T260 indítják, vagy ha egy rendszergaztakezelői jogosultsággal rendelkező felhasználó fut, DBCC TRACEON (260)és ha a kiterjesztett tárolt eljárás DLL nem támogatja __GetXpVersion(), a következő figyelmeztető üzenet jelenik meg a hibanaplóba (__GetXpVersion() két aláhúzással kezdődik).
Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().
Ha a kiterjesztett tárolt eljárás DLL exportálja __GetXpVersion(), de a függvény által visszaadott verzió kisebb, mint a szerver által igényelt verzió, akkor egy figyelmeztető üzenet jelenik meg, amely jelzi, hogy a függvény által visszaadott verziót és a szerver által várt verziót írja ki a hibanaplóba. Ha ezt az üzenetet kapod, akkor hibás értéket adsz vissza -ről __GetXpVersion(), vagy egy régebbi verzióval srv.hfordítasz.
Megjegyzés:
SetErrorMode, egy Win32 függvény, nem szabad kiterjesztett tárolt eljárásokban hívni.
A hosszú futású, kiterjesztett tárolt eljárásoknak időszakosan kell meghívniuk srv_got_attention , hogy az eljárás önmagát lezárhassa, ha a kapcsolat megszakad, vagy a batch megszakításra kerül.
Egy kiterjesztett tárolt eljárás DLL hibakereséséhez másold be az SQL Server \Binn könyvtárba. A hibakeresési munkamenet futtatható fájljának megadásához adja meg az SQL Server futtatható fájl útvonalát és fájlnevét (például C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Az argumentumokról szóló információkért sqlservr lásd: sqlservr alkalmazás.
Bővített tárolt eljárás hozzáadása az SQL Serverbe
Egy DLL, amely kiterjesztett tárolt eljárásfüggvényeket tartalmaz, az SQL Server kiterjesztéseként működik. A DLL telepítéséhez másoljuk be a fájlt egy könyvtárba, például arra, amely alapértelmezett SQL Server DLLC:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn fájlokat tartalmazza.
Miután a kiterjesztett tárolt eljárás DLL-ét átmásolták a szerverre, az SQL Server rendszergazdájának regisztrálnia kell az SQL Server-be minden kiterjesztett tárolt eljárás függvényt a DLL-ben. Ezt a sp_addextendedproc rendszer tárolt eljárásával végzik.
Fontos
A rendszergazdának alaposan át kell néznie egy kiterjesztett tárolt eljárást, hogy megbizonyosodjon arról, hogy nem tartalmaz-e káros vagy rosszindulatú kódot, mielőtt hozzáadná a szerverhez és más felhasználóknak megadná a végrehajtási engedélyeket. Ellenőrizze az összes felhasználói bemenetet. Ne kapcsold össze a felhasználói bemenetet, mielőtt ellenőriznéd. Soha ne hajtson végre páratlan felhasználói bemenetből létrehozott parancsot.
Az első paraméter sp_addextendedproc a függvény nevét határozza meg, a második paraméter pedig annak a DLL-nek a nevét, amelyben az adott függvény található. Meg kell határoznod a DLL teljes útját.
Megjegyzés:
Azok a meglévő DLL-ek, amelyeket nem regisztráltak teljes úttal, nem működnek SQL Server 2005 (9.x) vagy újabb verzióra frissítés után. A probléma javításához a DLL regisztrációjának megszüntetésére sp_dropextendedproc használjuk, majd újra regisztráljuk a sp_addextendedproc, teljes útvonal megadásával.
A függvény neve sp_addextendedproc , beleértve az esetet is, pontosan ugyanaznak kell lennie, mint a függvény neve a DLL-ben. Például ez a parancs egy dll-ben található függvényt xp_hello, regisztrál, amelyet , xp_hello.dllSQL Server kiterjesztett tárolt eljárásként regisztrál:
sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';
Ha a megadott sp_addextendedproc függvény neve nem egyezik pontosan a DLL-ben szereplő függvénynévvel, az új név regisztrált az SQL Serverben, de a név nem használható. Például, bár xp_Hello SQL Server kiterjesztett tárolt eljárásként xp_hello.dllvan regisztrálva, az SQL Server nem találja meg a függvényt a DLL-ben, ha xp_Hello később hívod a függvényt.
-- 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;
Íme a hibaüzenet:
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.).
Ha a függvényben sp_addextendedproc megadott függvény neve pontosan egyezik a DLL-ben szereplő függvénynévvel, és az SQL Server példány összeállítása ön-kis- és korosztályérzékeny, a felhasználó bármilyen kis és nagybetűs betűkombinációval hívhatja meg a kiterjesztett tárolt eljárást.
-- 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;
Ha az SQL Server példány összeállítása kis- és nagybetűre érzékeny, az SQL Server nem hívhatja meg a kiterjesztett tárolt eljárást, ha az eljárást más esettel hívják. Ez igaz akkor is, ha pontosan ugyanazzal a néven és összetétellel volt regisztrálva, mint a DLL-ben lévő függvény.
-- 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;
Íme a hibaüzenet:
Server: Msg 2812, Level 16, State 62, Line 1
Nem kell megállítani és újraindítani az SQL Servert.
SQL Serverbe telepített kiterjesztett tárolt eljárások lekérdezése
Az SQL Server által hitelesített felhasználó megjelenítheti a jelenleg definiált kiterjesztett tárolt eljárásokat és a DLL nevét, amelyhez mindegyik tartozik, a rendszer eljárás futtatásával sp_helpextendedproc . Például a következő példa visszaadja azt a DLL-t, amelyhez xp_hello tartozik:
sp_helpextendedproc 'xp_hello';
Ha sp_helpextendedproc a kiterjesztett tárolt eljárás megadása nélkül hajtják végre, akkor az összes kiterjesztett tárolt eljárás és azok DLL-jei megjelennek.
Távolítsa el egy kiterjesztett tárolt eljárást az SQL Serverből
Ahhoz, hogy minden kiterjesztett tárolt eljárásfüggvényt eltávolítsanak egy felhasználó által definiált kiterjesztett tárolt eljárás DLL-ben, az SQL Server rendszergazdájának futtatnia kell a sp_dropextendedproc rendszer tárolt eljárását, megadva a függvény nevét és annak a DLL-nek a nevét, amelyben az adott függvény található. Például ez a parancs eltávolítja a xp_hellofüggvényt , amely egy SQL Server nevű DLL-ben xp_hello.dll, található:
sp_dropextendedproc 'xp_hello';
sp_dropextendedproc Nem engedi el a rendszer kibővített tárolt eljárásait. Ehelyett a rendszergazdának meg kell tagadnia EXECUTE a kiterjesztett tárolt eljárás engedélyét a nyilvános szerep számára.
Kibővített tárolt eljárás DLL-ének kitöltése
Az SQL Server azonnal betölt egy kiterjesztett tárolt eljárás DLL-t, amint hívást hajtanak végre a DLL egyik funkciójára. A DLL betöltve marad, amíg a szervert le nem állítják, vagy amíg a rendszergazda addig használja a DBCC jelszót, hogy eltávolítsa. Például ez a parancs kitölti a xp_hello.dll, lehetővé téve a rendszergazdi számára, hogy a fájl egy újabb verzióját másolja a könyvtárba anélkül, hogy leállítaná a szervert:
DBCC xp_hello(FREE);
Kapcsolódó tartalom
- Közös nyelvi futtatókörnyezet (CLR) integrációja
- CLR Table-Valued funkciók
- Database Engine Kiterjesztett Tárolt Eljárások – Programozás
- SQL Serverbe telepített kiterjesztett tárolt eljárások lekérdezése
- srv_got_attention (Kiterjesztett Tárolt Eljárás API)
- sp_addextendedproc (Transact-SQL)
- sp_dropextendedproc (Transact-SQL)
- sp_helpextendedproc (Transact-SQL)
- DBCC dllname (INGYENES) (Transact-SQL)