Händelser
31 mars 23 - 2 apr. 23
Det största utbildningsevenemanget för SQL, Fabric och Power BI. 31 mars – 2 april. Använd koden FABINSIDER för att spara 400 USD.
Anmäl dig i dagDen här webbläsaren stöds inte längre.
Uppgradera till Microsoft Edge och dra nytta av de senaste funktionerna och säkerhetsuppdateringarna, samt teknisk support.
gäller för:Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Microsoft Fabric
Den sp_invoke_external_rest_endpoint
lagrade proceduren anropar en HTTPS REST-slutpunkt som anges som ett indataargument till proceduren.
Anteckning
Den sp_invoke_external_rest_endpoint
lagrade proceduren finns i förhandsversion för Azure SQL Managed Instance.
Varning
Med hjälp av den sp_invoke_external_rest_endpoint
lagrade proceduren kan data överföras till en extern entitet.
För att minska risken för obehörig åtkomst eller överföring av data bör du överväga följande metodtips för säkerhet:
Transact-SQL syntaxkonventioner
EXEC @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 ]
URL för HTTPS REST-slutpunkten som ska anropas. @url är nvarchar(4000) utan standard.
Unicode-sträng i ett JSON-, XML- eller TEXT-format som innehåller nyttolasten som ska skickas till HTTPS REST-slutpunkten. Nyttolaster måste vara ett giltigt JSON-dokument, ett välformat XML-dokument eller text. @payload är nvarchar(max) utan standard.
Rubriker som måste skickas som en del av begäran till HTTPS REST-slutpunkten. Rubriker måste anges med ett platt JSON-format (ett JSON-dokument utan kapslade strukturer). Rubriker som definierats i namn på förbjudna rubriker lista ignoreras även om de uttryckligen skickas i parametern @headers. deras värden ignoreras eller ersätts med systembaserade värden när HTTPS-begäran startas.
Parametern @headers är nvarchar(4000) utan standard.
HTTP-metod för att anropa URL:en. Måste vara något av följande värden: GET
, POST
, PUT
, PATCH
, DELETE
, HEAD
.
@method är nvarchar(6) med POST
som standardvärde.
Tid i sekunder tillåts för HTTPS-anropet att köras. Om den fullständiga HTTP-begäran och -svaret inte kan skickas och tas emot inom den definierade tidsgränsen på några sekunder stoppas körningen av den lagrade proceduren och ett undantag utlöses. Tidsgränsen startar när HTTP-anslutningen startar och slutar när svaret, och nyttolasten som ingår om någon, har tagits emot. @timeout är en positiv liten med standardvärdet 30. Godkända värden: 1 till 230.
Ange vilket DATABASE SCOPED CREDENTIAL-objekt som används för att mata in autentiseringsinformation i HTTPS-begäran. @credential är sysname utan standardvärde.
Tillåt att svaret som tas emot från den anropade slutpunkten skickas till den angivna variabeln. @response är nvarchar(max).
Körningen returnerar 0
om HTTPS-anropet har utförts och HTTP-statuskoden som tagits emot är en 2xx-statuskod (Success
). Om HTTP-statuskoden som tas emot inte finns i 2xx-intervallet blir returvärdet HTTP-statuskoden som tas emot. Om HTTPS-anropet inte kan utföras alls utlöses ett undantag.
Kräver KÖR VALFRI EXTERN ENDPOINT-databasbehörighet.
Till exempel:
GRANT EXECUTE ANY EXTERNAL ENDPOINT TO [<PRINCIPAL>];
Svaret från HTTP-anropet och resulterande data som skickas tillbaka av den anropade slutpunkten är tillgängligt via parametern @response utdata. @response kan innehålla ett JSON-dokument med följande schema:
{
"response": {
"status": {
"http": {
"code": "",
"description": ""
}
},
"headers": {}
},
"result": {}
}
Specifikt:
No Content
).Eller så kan @response innehålla ett XML-dokument med följande schema:
<output>
<response>
<status>
<http code="" description=" " />
</status>
<headers>
<header key="" value="" />
<header key="" value="" />
</headers>
</response>
<result>
</result>
</output>
Specifikt:
No Content
).I avsnittet response
, förutom HTTP-statuskoden och beskrivningen, kommer hela uppsättningen mottagna svarshuvuden att anges i headers
-objektet. I följande exempel visas ett response
avsnitt i JSON (även strukturen för textsvar):
"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"
}
}
I följande exempel visas ett response
avsnitt i 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>
Endast anrop till slutpunkter i följande tjänster tillåts:
Azure Service | Domän |
---|---|
Azure Functions | *.azurewebsites.net |
Azure Apps Service | *.azurewebsites.net |
Azure App Service-miljö | *.appserviceenvironment.net |
Azure Static Web Apps | *.azurestaticapps.net |
Azure Logic Apps | *.logic.azure.com |
Azure Event Hubs | *.servicebus.windows.net |
Azure Event Grid | *.eventgrid.azure.net |
Azure Cognitive Services | *.cognitiveservices.azure.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 | *.table.core.windows.net |
Azure Communication Services | *.communications.azure.com |
Bing-sökning | api.bing.microsoft.com |
Azure Key Vault | *.vault.azure.net |
Azure AI Search | *.search.windows.net |
Azure Maps | *.atlas.microsoft.com |
Azure AI Translator | api.cognitive.microsofttranslator.com |
Regler för utgående brandvägg för Azure SQL Database och Azure Synapse Analytics kontrollmekanism kan användas för att ytterligare begränsa utgående åtkomst till externa slutpunkter.
Anteckning
Om du vill anropa en REST-tjänst som inte finns i listan över tillåtna kan du använda API Management för att på ett säkert sätt exponera önskad tjänst och göra den tillgänglig för sp_invoke_external_rest_endpoint
.
Nyttolasten, både när den tas emot och när den skickas, kodas UTF-8 när den skickas via kabeln. I det formatet är dess storlek begränsad till 100 MB.
Den maximala URL-längden (som genereras efter användning av parametern @url och tillägg av angivna autentiseringsuppgifter i frågesträngen, om någon) är 8 KB. den maximala frågesträngslängden (frågesträng + frågesträng för autentiseringsuppgifter) är 4 KB.
Den maximala storleken på begäran och svarshuvud (alla rubrikfält: huvuden som skickas via @headers parameter + autentiseringshuvud + system angivna huvuden) är 8 KB.
Antalet samtidiga anslutningar till externa slutpunkter som görs via sp_invoke_external_rest_endpoint
begränsas till 10% arbetstrådar, med högst 150 arbetare. På en enskild databas tillämpas begränsning på databasnivå, och på en elastisk pool tillämpas begränsning både på databas- och poolnivå.
Kör följande fråga för att kontrollera hur många samtidiga anslutningar en databas kan upprätthålla:
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();
Om en ny anslutning till en extern slutpunkt med sp_invoke_external_rest_endpoint
provas när de maximala samtidiga anslutningarna redan har nåtts, utlöses fel 10928 (eller 10936 om du har nått gränsen för elastiska pooler). Till exempel:
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.
Vissa REST-slutpunkter kräver autentisering för att kunna anropas korrekt. Autentisering kan vanligtvis göras genom att skicka vissa specifika nyckel/värde-par i frågesträngen eller i HTTP-huvudena som angetts med begäran.
Det är möjligt att använda DATABASE SCOPED CREDENTIALS för att lagra autentiseringsdata på ett säkert sätt (t.ex. en ägartoken) som ska användas av sp_invoke_external_rest_endpoint
för att anropa en skyddad slutpunkt. När du skapar DATABASE SCOPED CREDENTIAL använder du parametern IDENTITY för att ange vilka autentiseringsdata som ska skickas till den anropade slutpunkten och hur. IDENTITY har stöd för fyra alternativ:
HTTPEndpointHeaders
: skicka angivna autentiseringsdata med hjälp av begärandehuvudenHTTPEndpointQueryString
: skicka angivna autentiseringsdata med hjälp av query stringManaged Identity
: skicka systemtilldelade hanterad identitet med hjälp av begärandehuvudenaShared Access Signature
: ge begränsad delegerad åtkomst till resurser via en signerad URL- (kallas även SAS)den skapade DATABASE SCOPED CREDENTIAL kan användas via parametern @credential:
EXEC 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>]
Med det här IDENTITY-värdet läggs DATABASE SCOPED CREDENTIAL till i begärandehuvudena. Nyckel/värde-paret som innehåller autentiseringsinformationen måste anges via parametern SECRET med ett platt JSON-format. Till exempel:
CREATE DATABASE SCOPED CREDENTIAL [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>]
WITH IDENTITY = 'HTTPEndpointHeaders', SECRET = '{"x-functions-key":"<your-function-key-here>"}';
Den skapade DATABASE SCOPED CREDENTIAL måste följa specifika regler för att kunna användas med sp_invoke_external_rest_endpoint
. Reglerna är följande:
https://northwind.azurewebsite.net/customers
inte användas för URL-https://northwind.azurewebsite.net
RFC 3986 Avsnitt 6.2.2.1 anger att "När en URI använder komponenter i den generiska syntaxen gäller alltid reglerna för komponentsyntaxens likvärdighet. nämligen att systemet och värden är skiftlägesokänsliga", och RFC 7230 avsnitt 2.7.3 nämner att "alla andra jämförs på ett skiftlägeskänsligt sätt".
Eftersom det finns en sorteringsregel som har angetts på databasnivå tillämpas följande logik, så att den överensstämmer med databassorteringsregeln och RFC som nämns ovan. (Den beskrivna regeln kan potentiellt vara mer restriktiv än RFC-reglerna, till exempel om databasen är inställd på att använda en skiftlägeskänslig sortering.):
Latin1_General_100_CI_AS_KS_WS_SC
)Latin1_General_100_BIN2
)Databasanvändare som har åtkomst till en DATABASE SCOPED CREDENTIAL måste ha behörighet att använda den autentiseringsuppgiften.
Om du vill använda autentiseringsuppgifterna måste en databasanvändare ha REFERENCES
behörighet för en specifik autentiseringsuppgift:
GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[<CREDENTIAL_NAME>] TO [<PRINCIPAL>];
När sp_invoke_external_rest_endpoint
väntar på att anropet till den anropade tjänsten ska slutföras rapporterar det en HTTP_EXTERNAL_CONNECTION väntetyp.
Endast slutpunkter som är konfigurerade att använda HTTPS med TLS-krypteringsprotokoll stöds.
sp_invoke_external_rest_endpoint
följer inte automatiskt någon HTTP-omdirigering som tas emot som ett svar från den anropade slutpunkten.
sp_invoke_external_rest_endpoint
matar automatiskt in följande huvuden i HTTP-begäran:
application/json; charset=utf-8
application/json
<EDITION>/<PRODUCT VERSION>
till exempel: SQL Azure/12.0.2000.8
Även om alltid skrivs över av den lagrade proceduren kan innehållstyp och acceptera huvudvärden vara användardefinierade via parametern @headers. Endast medietypsdirektivet tillåts anges i innehållstypen och det går inte att ange teckenuppsättningen eller gränsdirektiven.
Följande är godkända värden för rubriken innehållstyp.
För accepterar sidhuvud är följande godkända värden.
Mer information om texthuvudtyper finns i registret texttyp i IANA.
Anteckning
Om du testar anrop av REST-slutpunkten med andra verktyg, till exempel cURL- eller någon modern REST-klient som Insomnia, måste du inkludera samma huvuden som matas in automatiskt av sp_invoke_external_rest_endpoint
för att få samma beteende och resultat.
Anteckning
Den sp_invoke_external_rest_endpoint
lagrade proceduren finns i förhandsversion för Azure SQL Managed Instance.
Den sp_invoke_external_rest_endpoint
lagrade proceduren är tillgänglig i Azure SQL Managed Instance som konfigurerats med uppdateringsprincipen Always-up-to-date. Om du vill använda den här lagrade proceduren med din SQL-hanterade instans använder du först sp_configure för att aktivera alternativet external rest endpoint enabled
, som är aktiverat som standard i Azure SQL Database och SQL Database i Fabric.
Om du vill använda den sp_invoke_external_rest_endpoint
lagrade proceduren i Azure SQL Managed Instance kör du följande T-SQL-kod:
sp_configure 'external rest endpoint enabled', 1;
RECONFIGURE WITH OVERRIDE;
Om du vill köra sp_configure för att ändra ett konfigurationsalternativ eller köra RECONFIGURE-instruktionen måste en användare beviljas behörigheten ALTER SETTINGS på servernivå. Behörigheten ALTER SETTINGS innehas implicit av de fasta serverrollerna sysadmin och serveradmin.
Om du måste skicka en uppsättning rader till en REST-slutpunkt, till exempel till en Azure-funktion eller till en händelsehubb, rekommenderar vi att du batchar raderna i ett enda JSON-dokument för att undvika HTTPS-anropskostnaderna för varje rad som skickas. Detta kan göras med hjälp av FOR JSON
-instruktionen, till exempel:
-- 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 INT,
@response AS NVARCHAR(MAX);
EXEC @retcode = sp_invoke_external_rest_endpoint @url = '<REST_endpoint>',
@payload = @payload,
@response = @response OUTPUT;
-- return the result
SELECT @retcode, @response;
Här hittar du några exempel på hur du använder sp_invoke_external_rest_endpoint
för att integrera med vanliga Azure-tjänster som Azure Functions eller Azure Event Hubs. Fler exempel för att integrera med andra tjänster finns på GitHub-.
I följande exempel anropas en Azure-funktion med hjälp av en HTTP-utlösarbindning som tillåter anonym åtkomst.
DECLARE @ret INT, @response NVARCHAR(MAX);
EXEC @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;
I följande exempel anropas en Azure-funktion med en HTTP-utlösarbindning som konfigurerats för att kräva en auktoriseringsnyckel. Auktoriseringsnyckeln skickas i x-function-key
-huvudet enligt vad som krävs av Azure Functions. Mer information finns i Azure Functions – API-nyckelauktorisering.
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 INT, @response NVARCHAR(MAX);
EXEC @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;
I det här exemplet läss en fil från Azure Blob Storage med hjälp av en SAS-token för autentisering. Resultatet returneras i XML, så du behöver använda rubriken "Accept":"application/xml"
.
DECLARE @ret INT, @response NVARCHAR(MAX);
EXEC @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;
Det här exemplet visar hur du kan skicka meddelanden till Event Hubs med hjälp av Azure SQL Managed Identity. Kontrollera att du har konfigurerat systemhanterad identitet för den logiska Azure SQL Database-servern som är värd för databasen, till exempel:
az sql server update -g <resource-group> -n <azure-sql-server> --identity-type SystemAssigned
Därefter konfigurerar du Event Hubs så att Azure SQL Server hanterad identitet kan skicka meddelanden ("Azure Event Hubs Data Sender"-roll) till önskad händelsehubb. Mer information finns i Använda händelsehubbar med hanterade identiteter.
När detta är klart kan du använda identitetsnamnet Managed Identity
när du definierar databasens begränsade autentiseringsuppgifter som ska användas av sp_invoke_external_rest_endpoint
. Som beskrivs i Autentisera ett program med Microsoft Entra-ID för att få åtkomst till Event Hubs-resurserär resursnamnet (eller ID:t) som ska användas när du använder Microsoft Entra-autentisering 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 UNIQUEIDENTIFIER = NEWID();
DECLARE @payload NVARCHAR(MAX) = (
SELECT *
FROM (
VALUES (@Id, 'John', 'Doe')
) AS UserTable(UserId, FirstName, LastName)
FOR JSON AUTO,
WITHOUT_ARRAY_WRAPPER
)
DECLARE @url NVARCHAR(4000) = 'https://<EVENT-HUBS-NAME>.servicebus.windows.net/from-sql/messages';
DECLARE @headers NVARCHAR(4000) = N'{"BrokerProperties": "' + STRING_ESCAPE('{"PartitionKey": "' + CAST(@Id AS NVARCHAR(36)) + '"}', 'json') + '"}'
DECLARE @ret INT, @response NVARCHAR(MAX);
EXEC @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;
Det här exemplet skriver en fil till en Azure File Storage med en Azure SQL Database-omfångsautentisering för autentisering och returnerar sedan innehållet. Resultatet returneras i XML, så du behöver använda rubriken "Accept":"application/xml"
.
Börja med att skapa en huvudnyckel för Azure SQL Database
create master key encryption by password = '2112templesmlm2BTS21.qwqw!@0dvd'
go
Skapa sedan autentiseringsuppgifterna för databasen med hjälp av SAS-token som tillhandahålls av Azure Blob Storage-kontot.
create database scoped credential [filestore]
with identity='SHARED ACCESS SIGNATURE',
secret='sv=2022-11-02&ss=bfqt&srt=sco&sp=seespotrun&se=2023-08-03T02:21:25Z&st=2023-08-02T18:21:25Z&spr=https&sig=WWwwWWwwWWYaKCheeseNXCCCCCCDDDDDSSSSSU%3D'
go
Skapa sedan filen och lägg till text i den med följande två instruktioner:
declare @payload nvarchar(max) = (select * from (values('Hello from Azure SQL!', sysdatetime())) payload([message], [timestamp])for json auto, without_array_wrapper)
declare @response nvarchar(max), @url nvarchar(max), @headers nvarchar(1000);
declare @len int = len(@payload)
-- Create the File
set @url = 'https://myfiles.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')
exec 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://myfiles.file.core.windows.net/myfiles/test-me-from-azure-sql.json'
set @url += '?comp=range'
exec sp_invoke_external_rest_endpoint
@url = @url,
@method = 'PUT',
@headers = @headers,
@payload = @payload,
@credential = [filestore],
@response = @response output
select cast(@response as xml)
go
Använd slutligen följande instruktion för att läsa filen
declare @response nvarchar(max);
declare @url nvarchar(max) = 'https://myfiles.file.core.windows.net/myfiles/test-me-from-azure-sql.json'
exec sp_invoke_external_rest_endpoint
@url = @url,
@headers = '{"Accept":"application/xml"}',
@credential = [filestore],
@method = 'GET',
@response = @response output
select cast(@response as xml)
go
Händelser
31 mars 23 - 2 apr. 23
Det största utbildningsevenemanget för SQL, Fabric och Power BI. 31 mars – 2 april. Använd koden FABINSIDER för att spara 400 USD.
Anmäl dig i dag