Udostępnij za pośrednictwem


sp_invoke_external_rest_endpoint (Transact-SQL)

Dotyczy: SQL Server 2025 (17.x) (wersja zapoznawcza) Azure SQL Database Azure SQLManaged InstanceSQL Database w wersji zapoznawczej usługi Microsoft Fabric

Procedura składowana sp_invoke_external_rest_endpoint wywołuje punkt końcowy REST PROTOKOŁU HTTPS podany jako argument wejściowy procedury.

Note

Procedura sp_invoke_external_rest_endpoint składowana jest dostępna w wersji zapoznawczej programu SQL Server 2025 (17.x) (wersja zapoznawcza).

Sposoby ograniczania ryzyka nieautoryzowanego dostępu lub transferu danych

Caution

Użycie procedury składowanej sp_invoke_external_rest_endpoint umożliwia transfer danych do jednostki zewnętrznej.

Aby ograniczyć ryzyko nieautoryzowanego dostępu lub transferu danych, należy wziąć pod uwagę następujące najlepsze rozwiązania w zakresie zabezpieczeń:

  • Zaimplementuj silne mechanizmy kontroli dostępu: upewnij się, że tylko autoryzowani użytkownicy mają dostęp do poufnych danych i punktów końcowych interfejsu API REST. Należy użyć zasady najniższych uprawnień, a także ról i uprawnień bazy danych.
  • Prawidłowe uwierzytelnianie i autoryzacja: upewnij się, że wszystkie wywołania REST są uwierzytelniane i autoryzowane w celu zapobiegania nieautoryzowanemu dostępowi.
  • Monitorowanie i inspekcja dostępu: regularne monitorowanie i inspekcja dostępu do bazy danych i wywołań interfejsu API REST w celu wykrywania wszelkich podejrzanych działań.
  • regularne oceny zabezpieczeń: Przeprowadzaj regularne oceny zabezpieczeń i skanowania luk w zabezpieczeniach, aby zidentyfikować i ograniczyć potencjalne zagrożenia.
  • Szkolenia pracowników: Edukuj pracowników o ryzyku eksfiltracji danych i znaczenie następujących protokołów zabezpieczeń.

Syntax

Transact-SQL konwencje składni

EXECUTE @returnValue = sp_invoke_external_rest_endpoint
  [ @url = ] N'url'
  [ , [ @payload = ] N'request_payload' ]
  [ , [ @headers = ] N'http_headers_as_json_array' ]
  [ , [ @method = ] 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' ]
  [ , [ @timeout = ] seconds ]
  [ , [ @credential = ] credential ]
  [ , @response OUTPUT ]

Arguments

[ @url = ] N'url'

Adres URL punktu końcowego REST PROTOKOŁU HTTPS, który ma być wywoływany. @url jest nvarchar(4000) bez wartości domyślnej.

[ @payload = ] N'request_payload'

Ciąg Unicode w formacie JSON, XML lub TEXT zawierający ładunek do wysłania do punktu końcowego REST HTTPS. Ładunki muszą być prawidłowym dokumentem JSON, dobrze sformułowanym dokumentem XML lub tekstem. @payload nvarchar(max) bez wartości domyślnej.

[ @headers = ] Nagłówki N'"

Nagłówki, które muszą być wysyłane jako część żądania do punktu końcowego REST protokołu HTTPS. Nagłówki muszą być określone przy użyciu prostego formatu JSON (dokumentu JSON bez zagnieżdżonych struktur). Nagłówki zdefiniowane na liście nazw zabronionych nagłówków są ignorowane, nawet jeśli jawnie przekazano w parametrze @headers ; ich wartości są odrzucane lub zastępowane wartościami dostarczonymi przez system podczas uruchamiania żądania HTTPS.

Parametr @headers jest nvarchar(4000) bez wartości domyślnej.

[ @method = ] N'method'

Metoda HTTP do wywoływania adresu URL. Musi być jedną z następujących wartości: GET, POST, PUT, PATCH, DELETE, HEAD. @method nvarchar(6) z wartością domyślną POST.

[ @timeout = ] sekund

Czas w sekundach dozwolony dla uruchomienia wywołania HTTPS. Jeśli pełne żądanie HTTP i odpowiedź nie mogą być wysyłane i odbierane w ramach zdefiniowanego limitu czasu w sekundach, wykonywanie procedury składowanej zostanie zatrzymane i zostanie zgłoszony wyjątek. Limit czasu rozpoczyna się po uruchomieniu i zakończeniu połączenia HTTP, gdy odpowiedź i ładunek uwzględniony, jeśli istnieje, został odebrany. @timeout jest dodatnim smallint z wartością domyślną 30. Zaakceptowane wartości: od 1 do 230.

[ @credential = ] poświadczeń

Określ, który obiekt CREDENTIAL o zakresie bazy danych jest używany do wstrzykiwania informacji uwierzytelniania w żądaniu HTTPS. @credential jest nazwa_systemu bez wartości domyślnej.

dane wyjściowe @response

Zezwalaj na przekazanie odpowiedzi odebranej z wywoływanego punktu końcowego do określonej zmiennej. @response to nvarchar(max).

Return value

Wykonanie jest zwracane 0 , jeśli wykonano wywołanie HTTPS, a otrzymany kod stanu HTTP to kod stanu 2xx (Success). Jeśli otrzymany kod stanu HTTP nie znajduje się w zakresie 2xx, zwracana wartość to otrzymany kod stanu HTTP. Jeśli w ogóle nie można wykonać wywołania HTTPS, zostanie zgłoszony wyjątek.

Permissions

Database permissions

Wymaga uprawnień DO WYKONYWANIA DOWOLNEJ ZEWNĘTRZNEJ bazy danych PUNKTU KOŃCOWEGO.

For example:

GRANT EXECUTE ANY EXTERNAL ENDPOINT TO [<PRINCIPAL>];

Włączanie w programie SQL Server 2025 i usłudze Azure SQL Managed Instance

Note

Procedura sp_invoke_external_rest_endpoint składowana jest dostępna w wersji zapoznawczej programu SQL Server 2025 (17.x) (wersja zapoznawcza).

sp_invoke_external_rest_endpoint Procedura składowana jest dostępna w programie SQL Server 2025 (17.x) w wersji zapoznawczej i usłudze Azure SQL Managed Instance skonfigurowanym z zasadami zawszeup-to-date update i jest domyślnie wyłączona.

Aby włączyć procedurę sp_invoke_external_rest_endpoint składowaną w programie SQL Server 2025 (17.x) (wersja zapoznawcza) i usłudze Azure SQL Managed Instance, uruchom następujący kod T-SQL:

EXECUTE sp_configure 'external rest endpoint enabled', 1;

RECONFIGURE WITH OVERRIDE;

Aby wykonać sp_configure polecenie w celu zmiany opcji konfiguracji lub uruchomienia instrukcji RECONFIGURE , użytkownik musi mieć uprawnienie alter SETTINGS na poziomie serwera. Uprawnienie ALTER SETTINGS jest niejawnie przechowywane przez administrator systemu i serweradmin stałe role serwera.

Note

sp_invoke_external_rest_endpoint jest domyślnie włączona w usługach Azure SQL Database i SQL Database w sieci szkieletowej.

Response format

Odpowiedź wywołania HTTP i wynikowe dane wysyłane z powrotem przez wywołany punkt końcowy są dostępne za pośrednictwem parametru wyjściowego @response. @response może zawierać dokument JSON z następującym schematem:

{
  "response": {
    "status": {
      "http": {
        "code": "",
        "description": ""
      }
    },
    "headers": {}
  },
  "result": {}
}

Specifically:

  • odpowiedzi: obiekt JSON zawierający wynik HTTP i inne metadane odpowiedzi.
  • wynik: ładunek JSON zwrócony przez wywołanie HTTP. Pominięto, jeśli otrzymany wynik HTTP to 204 (No Content).

Lub @response może zawierać dokument XML z następującym schematem:

<output>
    <response>
        <status>
            <http code="" description=" " />
        </status>
        <headers>
            <header key="" value="" />
            <header key="" value="" />
        </headers>
    </response>
    <result>
    </result>
</output>

Specifically:

  • odpowiedzi: obiekt XML zawierający wynik HTTP i inne metadane odpowiedzi.
  • wynik: ładunek XML zwrócony przez wywołanie HTTP. Pominięto, jeśli otrzymany wynik HTTP to 204 (No Content).

response W sekcji oprócz kodu stanu HTTP i opisu cały zestaw odebranych nagłówków odpowiedzi jest udostępniany w headers obiekcie . Poniższy przykład przedstawia sekcję response w formacie JSON (także strukturę odpowiedzi tekstowych):

"response": {
  "status": {
    "http": {
      "code": 200,
      "description": "OK"
    }
  },
  "headers": {
    "Date": "Thu, 08 Sep 2022 21:51:22 GMT",
    "Content-Length": "1345",
    "Content-Type": "application\/json; charset=utf-8",
    "Server": "Kestrel",
    "Strict-Transport-Security": "max-age=31536000; includeSubDomains"
    }
  }

W poniższym przykładzie przedstawiono sekcję response w pliku XML:

<response>
    <status>
        <http code="200" description="OK" />
    </status>
    <headers>
        <header key="Date" value="Tue, 01 Apr 1976 21:12:04 GMT" />
        <header key="Content-Length" value="2112" />
        <header key="Content-Type" value="application/xml" />
        <header key="Server" value="Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" />
        <header key="x-ms-request-id" value="31536000-64bi-64bi-64bi-31536000" />
        <header key="x-ms-version" value="2021-10-04" />
        <header key="x-ms-creation-time" value="Wed, 19 Apr 2023 22:17:33 GMT" />
        <header key="x-ms-server-encrypted" value="true" />
    </headers>
</response>

Allowed endpoints

Important

Ta lista dotyczy tylko usług Azure SQL Database i Azure SQL Managed Instance.

Dozwolone są tylko wywołania punktów końcowych dla następujących usług:

Azure Service Domain
Azure Functions *.azurewebsites.net
Usługa Azure Apps *.azurewebsites.net
Azure App Service Environment *.appserviceenvironment.net
Azure Static Web Apps *.azurestaticapps.net
Aplikacje logiki Azure *.logic.azure.com
Azure Event Hubs *.servicebus.windows.net
Azure Event Grid *.eventgrid.azure.net
Usługi platformy Azure AI *.cognitiveservices.azure.com
*.api.cognitive.microsoft.com
Azure OpenAI *.openai.azure.com
PowerApps/ Dataverse *.api.crm.dynamics.com
Microsoft Dynamics *.dynamics.com
Azure Container Instances *.azurecontainer.io
Azure Container Apps *.azurecontainerapps.io
Power BI api.powerbi.com
Microsoft Graph graph.microsoft.com
Analysis Services *.asazure.windows.net
IoT Central *.azureiotcentral.com
API Management *.azure-api.net
Azure Blob Storage *.blob.core.windows.net
Azure Files *.file.core.windows.net
Azure Queue Storage *.queue.core.windows.net
Azure Table Storage (usługa przechowywania danych w tabelach) *.table.core.windows.net
Azure Communication Services *.communications.azure.com
Wyszukiwanie Bing api.bing.microsoft.com
Azure Key Vault *.vault.azure.net
Wyszukiwanie AI platformy Azure *.search.windows.net
Azure Maps *.atlas.microsoft.com
Tłumacz platformy Azure AI api.cognitive.microsofttranslator.com

reguł zapory ruchu wychodzącego dla usług Azure SQL Database i Azure Synapse Analytics mechanizm kontroli może służyć do dalszego ograniczania dostępu wychodzącego do zewnętrznych punktów końcowych.

Note

Jeśli chcesz wywołać usługę REST, która nie znajduje się na liście dozwolonych, możesz bezpiecznie uwidocznić żądaną usługę i udostępnić ją sp_invoke_external_rest_endpoint.

Limits

Payload size

Ładunek, zarówno w przypadku odebrania, jak i wysłania, jest zakodowany w formacie UTF-8 podczas wysyłania za pośrednictwem przewodu. W tym formacie jego rozmiar jest ograniczony do 100 MB.

URL length

Maksymalna długość adresu URL (wygenerowana po użyciu parametru @url i dodanie określonych poświadczeń do ciągu zapytania, jeśli istnieje) wynosi 8 KB; maksymalna długość ciągu zapytania (ciąg zapytania i ciąg zapytania poświadczeń) wynosi 4 KB.

Headers size

Maksymalny rozmiar nagłówka żądania i odpowiedzi (wszystkie pola nagłówka: nagłówki przekazywane za pośrednictwem @headers parametru + nagłówka poświadczeń + dostarczone nagłówki systemu) to 8 KB.

Throttling

Liczba równoczesnych połączeń z zewnętrznymi punktami końcowymi wykonywana za pośrednictwem sp_invoke_external_rest_endpoint jest ograniczona do 10% wątków roboczych, z maksymalnie 150 procesami roboczymi. W przypadku pojedynczej bazy danych ograniczanie jest wymuszane na poziomie bazy danych, podczas gdy na elastycznej puli ograniczanie jest wymuszane zarówno na poziomie bazy danych, jak i na poziomie puli.

Aby sprawdzić, ile równoczesnych połączeń może utrzymać baza danych, uruchom następujące zapytanie:

SELECT [database_name],
       DATABASEPROPERTYEX(DB_NAME(), 'ServiceObjective') AS service_level_objective,
       [slo_name] AS service_level_objective_long,
       [primary_group_max_outbound_connection_workers] AS max_database_outbound_connection,
       [primary_pool_max_outbound_connection_workers] AS max_pool_outbound_connection
FROM sys.dm_user_db_resource_governance
WHERE database_id = DB_ID();

Jeśli nowe połączenie z zewnętrznym punktem końcowym przy użyciu zostanie sp_invoke_external_rest_endpoint wypróbowane, gdy osiągnięto już maksymalną liczbę współbieżnych połączeń, zostanie zgłoszony błąd 10928 (lub 10936, jeśli osiągnięto limity pul elastycznych). For example:

Msg 10928, Level 16, State 4, Procedure sys.sp_invoke_external_rest_endpoint_internal, Line 1 [Batch Start Line 0]
Resource ID : 1. The outbound connections limit for the database is 20 and has been reached.
See 'https://docs.microsoft.com/azure/azure-sql/database/resource-limits-logical-server' for assistance.

Credentials

Niektóre punkty końcowe REST wymagają uwierzytelniania w celu poprawnego wywołania. Uwierzytelnianie można zwykle wykonać, przekazując niektóre określone pary klucz-wartość w ciągu zapytania lub w nagłówkach HTTP ustawionych za pomocą żądania.

Istnieje możliwość użycia DATABASE SCOPED CREDENTIAL do bezpiecznego przechowywania danych uwierzytelniania (na przykład tokenu elementu nośnego) do sp_invoke_external_rest_endpoint wywoływania chronionego punktu końcowego. Podczas tworzenia elementu użyj parametru DATABASE SCOPED CREDENTIALIDENTITY , aby określić, jakie dane uwierzytelniania są przekazywane do wywoływanego punktu końcowego i jak. IDENTITY obsługuje cztery opcje:

  • HTTPEndpointHeaders: wysyłanie określonych danych uwierzytelniania przy użyciu nagłówków żądań
  • : wysyłanie określonych danych uwierzytelniania przy użyciu ciągu zapytania
  • : wyślij tożsamości zarządzanej przypisanej przez system przy użyciu nagłówków żądania
  • Shared Access Signature: zapewniają ograniczony delegowany dostęp do zasobów za pośrednictwem podpisanego adresu URL (nazywanego również sygnaturą dostępu współdzielonego)

Utworzone można DATABASE SCOPED CREDENTIAL użyć za pomocą parametru @credential :

EXECUTE sp_invoke_external_rest_endpoint
    @url = N'https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?key1=value1',
    @credential = [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>];

Z tą IDENTITY wartością element DATABASE SCOPED CREDENTIAL jest dodawany do nagłówków żądań. Para klucz-wartość zawierająca informacje uwierzytelniania musi być podana za pośrednictwem parametru SECRET przy użyciu płaskiego formatu JSON. For example:

CREATE DATABASE SCOPED CREDENTIAL [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>]
WITH IDENTITY = 'HTTPEndpointHeaders', SECRET = '{"x-functions-key":"<your-function-key-here>"}';

Reguły nazw poświadczeń

Utworzone POŚWIADCZENIE O ZAKRESIE BAZY DANYCH musi być zgodne z określonymi regułami, aby można było ich używać z sp_invoke_external_rest_endpoint. Reguły są następujące:

  • Musi być prawidłowym adresem URL
  • Domena adresu URL musi być jedną z tych domen uwzględnionych na liście dozwolonych
  • Adres URL nie może zawierać ciągu zapytania
  • Protokół + w pełni kwalifikowana nazwa domeny (FQDN) wywoływanego adresu URL musi być zgodna z protokołem i nazwą FQDN nazwy poświadczeń
  • Każda część wywoływanej ścieżki adresu URL musi być całkowicie zgodna z odpowiednią częścią ścieżki adresu URL w nazwie poświadczeń
  • Poświadczenie musi wskazywać ścieżkę, która jest bardziej ogólna niż adres URL żądania. Na przykład nie można użyć poświadczeń utworzonych dla ścieżki https://northwind.azurewebsite.net/customers dla adresu URL https://northwind.azurewebsite.net

Reguły sortowania i nazw poświadczeń

RFC 3986 Sekcja 6.2.2.1 stwierdza, że "Gdy identyfikator URI używa składników składni ogólnej, reguły równoważności składni składników są zawsze stosowane; mianowicie, że schemat i host są bez uwzględniania wielkości liter" i RFC 7230 Sekcja 2.7.3 wspomina, że "wszystkie inne są porównywane w sposób uwzględniający wielkość liter".

Ponieważ na poziomie bazy danych jest ustawiona reguła sortowania, stosowana jest następująca logika, aby była spójna z regułą sortowania bazy danych i specyfikacją RFC wymienioną powyżej. (Opisana reguła może być potencjalnie bardziej restrykcyjna niż reguły RFC, na przykład jeśli baza danych ma używać sortowania uwzględniającego wielkość liter).

  1. Sprawdź, czy adres URL i poświadczenia są zgodne przy użyciu specyfikacji RFC, co oznacza:
    • Sprawdź schemat i host przy użyciu sortowania bez uwzględniania wielkości liter (Latin1_General_100_CI_AS_KS_WS_SC)
    • Sprawdź, czy wszystkie inne segmenty adresu URL są porównywane w sortowaniu uwzględniającym wielkość liter (Latin1_General_100_BIN2)
  2. Sprawdź, czy adres URL i poświadczenia są zgodne przy użyciu reguł sortowania bazy danych (i bez kodowania adresu URL).

Udzielanie uprawnień do używania poświadczeń

Użytkownicy bazy danych, którzy uzyskują dostęp do POŚWIADCZENIA W ZAKRESIE BAZY DANYCH, muszą mieć uprawnienia do używania tego poświadczenia.

Aby użyć poświadczeń, użytkownik bazy danych musi mieć REFERENCES uprawnienia do określonego poświadczenia:

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[<CREDENTIAL_NAME>] TO [<PRINCIPAL>];

Remarks

Wait type

Gdy sp_invoke_external_rest_endpoint oczekuje na zakończenie wywołania wywołania wywoływanej usługi, zgłasza HTTP_EXTERNAL_CONNECTION typ oczekiwania.

Protokoły HTTPS i TLS

Obsługiwane są tylko punkty końcowe skonfigurowane do używania protokołu HTTPS z protokołem szyfrowania TLS.

HTTP redirects

sp_invoke_external_rest_endpoint Nie jest automatycznie obserwowane żadne przekierowanie HTTP odebrane jako odpowiedź z wywoływanego punktu końcowego.

HTTP headers

sp_invoke_external_rest_endpoint automatycznie wprowadza następujące nagłówki w żądaniu HTTP:

  • typu zawartości: ustaw wartość application/json; charset=utf-8
  • zaakceptować: ustaw wartość na application/json
  • agenta użytkownika: ustaw <EDITION>/<PRODUCT VERSION> na przykład: SQL Azure/12.0.2000.8

Chociaż agent użytkownika jest zawsze zastępowany przez procedurę składowaną, wartości typu zawartości i akceptowania nagłówka mogą być definiowane przez użytkownika za pośrednictwem parametru @headers . Tylko dyrektywa typu nośnika może być określona w typie zawartości i określenie dyrektyw charset lub granic nie jest możliwe.

Ładunki żądań i odpowiedzi obsługiwane typów multimediów

Poniżej są akceptowane wartości nagłówka typu zawartości.

  • application/json
  • application/vnd.microsoft.*.json
  • application/xml
  • application/vnd.microsoft.*.xml
  • application/vnd.microsoft.*+xml
  • application/x-www-form-urlencoded
  • text/*

W przypadku zaakceptuj nagłówek są akceptowane wartości.

  • application/json
  • application/xml
  • text/*

Aby uzyskać więcej informacji na temat typów nagłówków tekstowych, zobacz rejestr typów tekstu w usłudze IANA.

Note

Jeśli testujesz wywołanie punktu końcowego REST za pomocą innych narzędzi, takich jak cURL lub dowolny nowoczesny klient REST, taki jak bezsenność, upewnij się, że dołącz te same nagłówki, które są automatycznie wstrzykiwane przez sp_invoke_external_rest_endpoint, aby mieć takie samo zachowanie i wyniki.

Best practices

Używanie techniki przetwarzania wsadowego

Jeśli musisz wysłać zestaw wierszy do punktu końcowego REST, na przykład do funkcji platformy Azure lub centrum zdarzeń, zaleca się dzielenie wierszy na pojedynczy dokument JSON, aby uniknąć obciążenia wywołania HTTPS dla każdego wysłanego wiersza. Można to zrobić przy użyciu instrukcji FOR JSON, na przykład:

-- create the payload
DECLARE @payload AS NVARCHAR (MAX);

SET @payload = (SELECT [object_id],
                       [name],
                       [column_id]
                FROM sys.columns
                FOR JSON AUTO);

-- invoke the REST endpoint
DECLARE @retcode AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @retcode = sp_invoke_external_rest_endpoint
    @url = '<REST_endpoint>',
    @payload = @payload,
    @response = @response OUTPUT;

-- return the result
SELECT @retcode,
       @response;

Examples

Tutaj można znaleźć kilka przykładów dotyczących sposobu używania sp_invoke_external_rest_endpoint do integracji z typowymi usługami platformy Azure, takimi jak Azure Functions lub Azure Event Hubs. Więcej przykładów do integracji z innymi usługami można znaleźć w witrynie GitHub.

A. Wywoływanie funkcji platformy Azure przy użyciu powiązania wyzwalacza HTTP bez uwierzytelniania

Poniższy przykład wywołuje funkcję platformy Azure przy użyciu powiązania wyzwalacza HTTP umożliwiającego dostęp anonimowy.

DECLARE @ret AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @ret = sp_invoke_external_rest_endpoint
    @url = N'https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?key1=value1',
    @headers = N'{"header1":"value_a", "header2":"value2", "header1":"value_b"}',
    @payload = N'{"some":{"data":"here"}}',
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode,
       @response AS Response;

B. Wywoływanie funkcji platformy Azure przy użyciu powiązania wyzwalacza HTTP z kluczem autoryzacji

Poniższy przykład wywołuje funkcję platformy Azure przy użyciu powiązania wyzwalacza HTTP skonfigurowanego do wymagania klucza autoryzacji. Klucz autoryzacji jest przekazywany w nagłówku zgodnie z x-function-key wymaganiami usługi Azure Functions. Aby uzyskać więcej informacji, zobacz Azure Functions — autoryzacja klucza interfejsu API.

CREATE DATABASE SCOPED CREDENTIAL [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>]
    WITH IDENTITY = 'HTTPEndpointHeaders', SECRET = '{"x-functions-key":"<your-function-key-here>"}';

DECLARE @ret AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @ret = sp_invoke_external_rest_endpoint
    @url = N'https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?key1=value1',
    @headers = N'{"header1":"value_a", "header2":"value2", "header1":"value_b"}',
    @credential = [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>],
    @payload = N'{"some":{"data":"here"}}',
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode,
       @response AS Response;

C. Odczytywanie zawartości pliku z usługi Azure Blob Storage przy użyciu tokenu SAS

W tym przykładzie odczytuje plik z usługi Azure Blob Storage przy użyciu tokenu SAS na potrzeby uwierzytelniania. Wyniki są zwracane w formacie XML, dlatego należy użyć nagłówka "Accept":"application/xml".

DECLARE @ret AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @ret = sp_invoke_external_rest_endpoint
    @url = N'https://blobby.blob.core.windows.net/datafiles/my_favorite_blobs.txt?sp=r&st=2023-07-28T19:56:07Z&se=2023-07-29T03:56:07Z&spr=https&sv=2022-11-02&sr=b&sig=XXXXXX1234XXXXXX6789XXXXX',
    @headers = N'{"Accept":"application/xml"}',
    @method = 'GET',
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode,
       @response AS Response;

D. Wysyłanie komunikatu do centrum zdarzeń przy użyciu tożsamości zarządzanej usługi Azure SQL Database

W tym przykładzie pokazano, jak można wysyłać komunikaty do usługi Event Hubs przy użyciu tożsamości zarządzanej usługi Azure SQL. Upewnij się, że skonfigurowano System Managed Identity dla serwera logicznego usługi Azure SQL Database hostowania bazy danych, na przykład:

az sql server update -g <resource-group> -n <azure-sql-server> --identity-type SystemAssigned

Następnie skonfiguruj usługę Event Hubs, aby umożliwić tożsamości zarządzanej programu Azure SQL Server wysyłanie komunikatów ("Rola nadawcy danych usługi Azure Event Hubs") do żądanego centrum zdarzeń. Aby uzyskać więcej informacji, zobacz Używanie usługi Event Hubs z tożsamościami zarządzanymi.

Po wykonaniu Managed Identity tej czynności można użyć nazwy tożsamości podczas definiowania poświadczeń o określonym zakresie bazy danych, które są używane przez sp_invoke_external_rest_endpointprogram . Jak wyjaśniono w Uwierzytelnij aplikację przy użyciu identyfikatora Entra firmy Microsoft w celu uzyskania dostępu do zasobów usługi Event Hubs, nazwa zasobu (lub identyfikator) używana podczas korzystania z uwierzytelniania microsoft Entra jest https://eventhubs.azure.net:

CREATE DATABASE SCOPED CREDENTIAL [https://<EVENT-HUBS-NAME>.servicebus.windows.net]
WITH IDENTITY = 'Managed Identity', SECRET = '{"resourceid": "https://eventhubs.azure.net"}';
GO

DECLARE @Id AS UNIQUEIDENTIFIER = NEWID();

DECLARE @payload AS NVARCHAR (MAX) = (SELECT *
    FROM (VALUES (@Id, 'John', 'Doe')) AS UserTable(UserId, FirstName, LastName)
    FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER);

DECLARE @url AS NVARCHAR (4000) = 'https://<EVENT-HUBS-NAME>.servicebus.windows.net/from-sql/messages';

DECLARE @headers AS NVARCHAR (4000) = N'{"BrokerProperties": "'
    + STRING_ESCAPE('{"PartitionKey": "'
    + CAST (@Id AS NVARCHAR (36)) + '"}', 'json') + '"}';

DECLARE @ret AS INT, @response AS NVARCHAR (MAX);

EXECUTE
    @ret = sp_invoke_external_rest_endpoint
    @url = @url,
    @headers = @headers,
    @credential = [https://<EVENT-HUBS-NAME>.servicebus.windows.net],
    @payload = @payload,
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode,
       @response AS Response;

E. Odczytywanie i zapisywanie pliku w usłudze Azure File Storage przy użyciu poświadczeń o zakresie usługi Azure SQL Database

W tym przykładzie plik jest zapisywany w usłudze Azure File Storage przy użyciu poświadczeń o zakresie usługi Azure SQL Database na potrzeby uwierzytelniania, a następnie zwraca zawartość. Wyniki są zwracane w formacie XML, dlatego należy użyć nagłówka "Accept":"application/xml".

Zacznij od utworzenia klucza głównego dla bazy danych Azure SQL Database. Zastąp <password> ciąg silnym hasłem.

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

Następnie utwórz poświadczenia o zakresie bazy danych przy użyciu tokenu SAS dostarczonego przez konto usługi Azure Blob Storage. Zastąp <token> element podanym tokenem SAS.

CREATE DATABASE SCOPED CREDENTIAL [filestore]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<token>';
GO

Następnie utwórz plik i dodaj do niego tekst za pomocą następujących dwóch instrukcji. Zastąp <domain> ciąg odpowiednią ścieżką.

DECLARE @payload AS NVARCHAR (MAX) = (SELECT *
    FROM (VALUES ('Hello from Azure SQL!', sysdatetime())) AS payload([message], [timestamp])
    FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER);

DECLARE @response AS NVARCHAR (MAX);
DECLARE @url AS NVARCHAR (MAX);
DECLARE @headers AS NVARCHAR (1000);

DECLARE @len AS INT = len(@payload);

-- Create the file
SET @url = 'https://<domain>.file.core.windows.net/myfiles/test-me-from-azure-sql.json';
SET @headers = JSON_OBJECT('x-ms-type':'file', 'x-ms-content-length':CAST (@len AS VARCHAR (9)), 'Accept':'application/xml');

EXECUTE sp_invoke_external_rest_endpoint
    @url = @url,
    @method = 'PUT',
    @headers = @headers,
    @credential = [filestore],
    @response = @response OUTPUT;

SELECT CAST (@response AS XML);

-- Add text to the file
SET @headers = JSON_OBJECT('x-ms-range':'bytes=0-' + CAST (@len - 1 AS VARCHAR (9)), 'x-ms-write':'update', 'Accept':'application/xml');
SET @url = 'https://<domain>.file.core.windows.net/myfiles/test-me-from-azure-sql.json';
SET @url += '?comp=range';

EXECUTE sp_invoke_external_rest_endpoint
    @url = @url,
    @method = 'PUT',
    @headers = @headers,
    @payload = @payload,
    @credential = [filestore],
    @response = @response OUTPUT;

SELECT CAST (@response AS XML);
GO

Na koniec użyj następującej instrukcji, aby odczytać plik. Zastąp <domain> ciąg odpowiednią ścieżką.

DECLARE @response AS NVARCHAR (MAX);

DECLARE @url AS NVARCHAR (MAX) = 'https://<domain>.file.core.windows.net/myfiles/test-me-from-azure-sql.json';

EXECUTE sp_invoke_external_rest_endpoint
    @url = @url,
    @headers = '{"Accept":"application/xml"}',
    @credential = [filestore],
    @method = 'GET',
    @response = @response OUTPUT;

SELECT CAST (@response AS XML);
GO

F. Wywoływanie interfejsu OpenAI platformy Azure przy użyciu tożsamości zarządzanej

Poniższy przykład wywołuje model usługi Azure OpenAI przy użyciu tożsamości zarządzanych w usłudze Microsoft Entra for Azure SQL. Zastąp <my-azure-openai-endpoint> wartości i <model-deployment-name> odpowiednio nazwą punktu końcowego i modelu usługi Azure OpenAI, a następnie upewnij się, że nadano tożsamość zarządzaną rolę użytkownika openAI usług Cognitive Services w usłudze Azure OpenAI.

CREATE DATABASE SCOPED CREDENTIAL [https://<my-azure-openai-endpoint>.openai.azure.com]
    WITH IDENTITY = 'Managed Identity', SECRET = '{"resourceid":"https://cognitiveservices.azure.com"}';
GO

DECLARE @response AS NVARCHAR (MAX);

DECLARE @payload AS NVARCHAR (MAX) = JSON_OBJECT('input':'hello world');

EXECUTE sp_invoke_external_rest_endpoint
    @url = 'https://<my-azure-openai-endpoint>.openai.azure.com/openai/deployments/<model-deployment-name>/embeddings?api-version=2024-08-01-preview',
    @method = 'POST',
    @credential = [https://<my-azure-openai-endpoint>.openai.azure.com],
    @payload = @payload,
    @response = @response OUTPUT;

SELECT json_query(@response, '$.result.data[0].embedding'); -- Assuming the called model is an embedding model