Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Ważne
Ta funkcja zostanie usunięta w przyszłej wersji programu SQL Server. Unikaj używania tej funkcji w nowych pracach programistycznych i zaplanuj modyfikowanie aplikacji, które obecnie korzystają z tej funkcji. Zamiast tego użyj integracji CLR .
Jak działają rozszerzone procedury przechowywane
Proces, w którym działa rozszerzona procedura przechowywana, jest następujący:
Gdy klient wykonuje rozszerzoną procedurę przechowywaną, żądanie jest przesyłane w tabelarzowym strumieniu danych (TDS) lub w formacie Simple Object Access Protocol (SOAP) z aplikacji klienckiej do SQL Server.
SQL Server wyszukuje DLL powiązane z rozszerzoną procedurą przechowywaną i ładuje DLL, jeśli nie jest już załadowana.
SQL Server wywołuje żądaną rozszerzoną procedurę przechowywaną (zaimplementowaną jako funkcja wewnątrz DLL).
Rozszerzona procedura przechowywana przekazuje zestawy wyników i zwraca parametry z powrotem do serwera poprzez API Extended Stored Procedure.
W przeszłości Open Data Services były wykorzystywane do pisania aplikacji serwerowych, takich jak bramy do środowisk baz danych spoza SQL Server. SQL Server nie obsługuje przestarzałych części API Open Data Services. Jedyną częścią oryginalnego API Open Data Services nadal obsługiwaną przez SQL Server są rozszerzone funkcje procedur przechowywanych, dlatego API zostało przemianowane na Extended Stored Procedure API.
Wraz z pojawieniem się rozproszonych zapytań i integracji CLR, potrzeba aplikacji API Extended Stored Procedure została w dużej mierze zastąpiona.
Jeśli masz istniejące aplikacje bramowe, nie możesz użyć tych opends60.dll , które są dołączone do SQL Server, aby uruchomić aplikacje. Aplikacje bramowe nie są już wspierane.
Rozszerzone procedury przechowywane vs. integracja z CLR
Integracja CLR stanowi bardziej solidną alternatywę dla pisania logiki po stronie serwera, którą trudno było wyrazić lub zapisać w Transact-SQL. We wcześniejszych wersjach SQL Server rozszerzone procedury przechowywane (XP) stanowiły jedyny mechanizm dostępny dla twórców aplikacji bazodanowych do pisania takiego kodu.
W integracji CLR logika wcześniej zapisywana w formie procedur przechowywanych jest często lepiej wyrażona jako funkcje tabelowe, które pozwalają na zapytania SELECT wyników skonstruowanych przez funkcję poprzez osadzenie ich w klauzuli FROM .
Więcej informacji można znaleźć w przeglądzie integracji CLR.
Charakterystyka wykonania rozszerzonych procedur przechowywanych
Wykonanie rozszerzonej procedury przechowywanej ma następujące cechy:
Funkcja rozszerzonej procedury przechowywanej jest wykonywana w kontekście bezpieczeństwa SQL Servera.
Rozszerzona funkcja procedur przechowywanych działa w przestrzeni procesowej SQL Servera.
Wątek powiązany z wykonaniem rozszerzonej procedury przechowywanej jest tym samym, który służy do połączenia klienta.
Ważne
Przed dodaniem rozszerzonych procedur przechowywanych na serwerze i przyznaniem uprawnień do wykonywania innym użytkownikom, administrator systemu powinien dokładnie przejrzeć każdą rozszerzoną procedurę przechowywaną, aby upewnić się, że nie zawiera ona szkodliwego lub złośliwego kodu.
Po załadowaniu rozszerzonej procedury przechowywanej DLL, DLL pozostaje załadowane w przestrzeni adresowej serwera, dopóki SQL Server nie zostanie zatrzymany lub administrator wyraźnie nie odłączy DLL za pomocą .DBCC <DLL_name> (FREE)
Rozszerzona procedura przechowywana może być wykonana z Transact-SQL jako procedura przechowywana, używając EXECUTE instrukcji:
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;
Parametry
@ retval
Wartość zwrotu.
@ param1
Parametr wejściowy.
@ param2
Parametr wejścia/wyjścia.
Ostrzeżenie
Rozszerzone procedury przechowywane oferują poprawę wydajności i rozszerzają funkcjonalność SQL Server. Jednak ponieważ rozszerzona procedura przechowywana DLL i SQL Server dzielą tę samą przestrzeń adresową, procedura problemowa może negatywnie wpłynąć na działanie SQL Server. Chociaż wyjątki wyrzucane przez rozszerzoną procedurę DLL są obsługiwane przez SQL Server, możliwe jest uszkodzenie obszarów danych SQL Server. Ze względów bezpieczeństwa tylko administratorzy systemów SQL Server mogą dodawać rozszerzone procedury przechowywane do SQL Server. Procedury te powinny być dokładnie przetestowane przed instalacją.
Wysyłanie zestawów wyników do serwera za pomocą API Extended Stored Procedure
Podczas wysyłania zbioru wyników do SQL Server, rozszerzona procedura przechowywana powinna wywołać odpowiednie API w następujący sposób:
Funkcję
srv_sendmsgmożna wywołać w dowolnej kolejności przed lub po wszystkich wierszach (jeśli występują) z .srv_sendrowWszystkie wiadomości muszą zostać wysłane do klienta przed wysłaniem statusu zakończenia z .srv_senddoneFunkcja jest
srv_sendrowwywoływana raz dla każdego wiersza wysyłanego do klienta. Wszystkie wiersze muszą zostać wysłane do klienta przed wysłaniem jakichkolwiek wiadomości, wartości statusu lub statusów zakończenia zsrv_sendmsg, argumentemsrv_statussrv_pfield, lubsrv_senddone.Wysłanie wiersza, który nie ma wszystkich kolumn zdefiniowanych z ,
srv_describepowoduje wywołanie przez aplikację komunikat o błędzie informacyjnym i zwracanie doFAILklienta. W tym przypadku wiersz nie zostaje wysłany.
Utwórz rozszerzone procedury przechowywane
Rozszerzona procedura przechowywana to funkcja C/C++ z prototypem:
kodu SRVRETCODE xp_extendedProcName (SRVPROC *);
Użycie prefiksu xp_ jest opcjonalne. Rozszerzone nazwy procedur przechowywanych są wrażliwe na wielka litera, gdy są odwoływane w Transact-SQL instrukcjach, niezależnie od strony kodowej/porządku sortowania zainstalowanego na serwerze. Kiedy budujesz DLL:
Jeśli punkt wejściowy jest konieczny, zapisz funkcję
DllMain.Ta funkcja jest opcjonalna. Jeśli nie podasz tego w kodzie źródłowym, kompilator łączy swoją własną wersję, która nie robi nic poza zwracaniem
TRUE. Jeśli podasz funkcjęDllMain, system operacyjny wywołuje ją, gdy wątek lub proces dołącza się do DLL lub od niego odłącza.Wszystkie funkcje wywoływane spoza DLL (wszystkie rozszerzone procedury Efunctions) muszą być eksportowane.
Możesz wyeksportować funkcję, wpisując jej nazwę w
EXPORTSsekcji pliku.def, lub możesz poprzedzić nazwę funkcji w kodzie źródłowym ,__declspec(dllexport)rozszerzenie kompilatora Microsoftu (__declspec()zaczyna się od dwóch podkreśleń).
Pliki te są niezbędne do utworzenia rozszerzonej procedury DLL.
| File | Description |
|---|---|
srv.h |
Plik nagłówka API Rozszerzonej Procedury Przechowywanej |
opends60.lib |
Importuj bibliotekę dla opends60.dll |
Aby utworzyć rozszerzoną procedurę DLL, należy utworzyć projekt o nazwie Dynamic Link Library. Więcej informacji o tworzeniu DLL można znaleźć w dokumentacji środowiska programistycznego.
Wszystkie DLL procedur rozszerzonych przechowywanych powinny implementować i eksportować następującą funkcję:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
__declspec(dllexport) to specyficzne dla Microsoftu rozszerzenie kompilatora. Jeśli Twój kompilator nie obsługuje tej dyrektywy, powinieneś wyeksportować tę funkcję do DEF pliku w EXPORTS sekcji tej sekcji.
Gdy SQL Server zostanie uruchomiony z flagą -T260 śledzenia lub jeśli użytkownik z uprawnieniami DBCC TRACEON (260)administratora systemu uruchamia , a rozszerzona procedura DLL nie obsługuje __GetXpVersion(), do logu błędów wyświetlany jest następujący komunikat ostrzegawczy (__GetXpVersion() zaczyna się od dwóch podkreśleń).
Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().
Jeśli rozszerzona procedura przechowywana DLL eksportuje __GetXpVersion(), ale wersja zwrócona przez funkcję jest mniejsza niż wymagana przez serwer, do logu błędów wypisuje się komunikat ostrzegawczy o wersji zwróconej przez funkcję i oczekiwanej przez serwer. Jeśli otrzymasz ten komunikat, zwracasz błędną wartość z __GetXpVersion(), albo kompilujesz z starszą wersją srv.h.
Uwaga / Notatka
SetErrorMode, funkcja Win32, nie powinna być wywoływana w rozszerzonych procedurach przechowywanych.
Długotrwałe procedury o rozszerzonym przechowywaniu powinny wywoływać srv_got_attention procedury okresowo, aby procedura mogła się zakończyć, jeśli połączenie zostanie przerwane lub partia zostanie przerwana.
Aby debugować rozszerzoną procedurę DLL, skopiuj ją do katalogu SQL Server \Binn . Aby określić plik wykonywalny sesji debugującej, wprowadź ścieżkę i nazwę pliku wykonywalnego SQL Server (na przykład C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Informacje o argumentach sqlservr można znaleźć w sekcji sqlservr Application.
Dodaj rozszerzoną procedurę przechowywaną do SQL Server
DLL zawierający rozszerzone funkcje procedur przechowywanych działa jako rozszerzenie SQL Servera. Aby zainstalować DLL, skopiuj plik do katalogu, na przykład takiego, który zawiera standardowe pliki SQL Server DLL (C:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn domyślnie).
Po skopiowaniu rozszerzonej procedury DLL na serwer, administrator systemu SQL Server musi rejestrować każdą rozszerzoną funkcję procedury przechowywanej w SQL Server w DLL. Odbywa się to za pomocą procedury systemowej sp_addextendedproc przechowywanej.
Ważne
Administrator systemu powinien dokładnie przejrzeć rozszerzoną procedurę przechowywaną, aby upewnić się, że nie zawiera ona szkodliwego lub złośliwego kodu, zanim doda ją do serwera i przyzna uprawnienia do wykonywania innym użytkownikom. Zweryfikuj wszystkie dane wejściowe użytkownika. Nie łącz danych użytkowników przed ich weryfikacją. Nigdy nie wykonaj polecenia skonstruowanego z niewaleowanych danych wejściowych użytkownika.
Pierwszy parametr określa sp_addextendedproc nazwę funkcji, a drugi parametr określa nazwę DLL, w której ta funkcja się znajduje. Powinieneś określić pełną ścieżkę DLL.
Uwaga / Notatka
Istniejące DLL, które nie zostały zarejestrowane z pełną ścieżką, nie działają po aktualizacji do SQL Server 2005 (9.x) lub nowszej wersji. Aby rozwiązać problem, użyj sp_dropextendedproc wyrejestrowania DLL, a następnie ponownego zarejestrowania z sp_addextendedproc, określeniem pełnej ścieżki.
Nazwa funkcji określonej w musi sp_addextendedproc być dokładnie taka sama, włącznie z przypadkiem, jak nazwa funkcji w DLL. Na przykład to polecenie rejestruje funkcję xp_hello, znajdującą się w dll o nazwie xp_hello.dll, jako rozszerzoną procedurę przechowywaną SQL Server:
sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';
Jeśli nazwa funkcji określonej w sp_addextendedproc nie zgadza się dokładnie z nazwą funkcji w DLL, nowa nazwa jest rejestrowana w SQL Server, ale nie jest używalna. Na przykład, chociaż xp_Hello jest zarejestrowana jako rozszerzona procedura przechowywana SQL Server znajdująca się w xp_hello.dll, SQL Server nie może znaleźć tej funkcji w DLL, jeśli używasz xp_Hello jej do późniejszego wywołania.
-- 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;
Oto komunikat o błędzie:
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.).
Jeśli nazwa funkcji podanej w dokładnie sp_addextendedproc odpowiada nazwie funkcji w DLL, a zestawienie instancji SQL Server jest niewrażliwe na wielka litera, użytkownik może wywołać rozszerzoną procedurę przechowywaną dowolną kombinacją małych i wielkich liter nazwy.
-- 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;
Gdy kolacja instancji SQL Server jest wrażliwa na wielka i wielka litera, SQL Server nie może wywołać rozszerzonej procedury przechowywanej, jeśli procedura jest wywoływana z innym przypadkiem. Dotyczy to nawet sytuacji, gdy funkcja w DLL była zarejestrowana dokładnie pod tą samą nazwą i tą samą kolejnością.
-- 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;
Oto komunikat o błędzie:
Server: Msg 2812, Level 16, State 62, Line 1
Nie musisz przerywać i restartować SQL Servera.
Zapytanie o rozszerzone procedury przechowywane zainstalowane w SQL Server
Użytkownik uwierzytelniony przez SQL Server może wyświetlić obecnie zdefiniowane rozszerzone procedury przechowywane oraz nazwę DLL, do których każda z nich należy, uruchamiając procedurę systemową sp_helpextendedproc . Na przykład poniższy przykład zwraca DLL, do którego xp_hello należy:
sp_helpextendedproc 'xp_hello';
Jeśli sp_helpextendedproc jest wykonywany bez określania rozszerzonej procedury przechowywanej, wyświetlane są wszystkie rozszerzone procedury przechowywane i ich DLL.
Usuń rozszerzoną procedurę przechowywaną z SQL Server
Aby usunąć każdą funkcję rozszerzonej procedury przechowywanej w rozszerzonej procedurze DLL zdefiniowanej przez użytkownika, administrator systemu SQL Server musi uruchomić procedurę sp_dropextendedproc systemową przechowywaną, określając nazwę funkcji oraz nazwę DLL, w którym ta funkcja się znajduje. Na przykład to polecenie usuwa funkcję xp_hello, znajdującą się w DLL xp_hello.dll, nazwanej z SQL Server:
sp_dropextendedproc 'xp_hello';
sp_dropextendedproc Nie usuwa systemowych rozszerzonych procedur przechowywanych. Zamiast tego administrator systemu powinien odmówić EXECUTE pozwolenia na rozszerzoną procedurę przechowywaną roli publicznej .
Usuń rozszerzoną procedurę DLL
SQL Server ładuje rozszerzoną procedurę DLL po wykonaniu wywołania jednej z funkcji DLL. DLL pozostaje załadowany do momentu wyłączenia serwera lub do momentu, gdy administrator systemu użyje DBCC tego polecenia do jego wyładowania. Na przykład to polecenie uruchamia xp_hello.dll, umożliwiając administratorowi systemu skopiowanie nowszej wersji tego pliku do katalogu bez wyłączania serwera:
DBCC xp_hello(FREE);
Treści powiązane
- Integracja środowiska uruchomieniowego języka wspólnego (CLR)
- Funkcje Table-Valued CLR
- Rozszerzone procedury przechowywane silnika baz danych – programowanie
- Zapytania do rozszerzonych procedur przechowywanych zainstalowanych w SQL Server
- srv_got_attention (API Rozszerzonych Procedur Przechowywanych)
- sp_addextendedproc (Transact-SQL)
- sp_dropextendedproc (Transact-SQL)
- sp_helpextendedproc (Transact-SQL)
- DBCC dllname (FREE) (Transact-SQL)