Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : SQL Server 2025 (17.x) Préversion de
la base de données SQL Azure SQL Database
Azure SQL Managed Instance
SQL dans Microsoft Fabric
La sp_invoke_external_rest_endpoint
procédure stockée appelle un point de terminaison REST HTTPS fourni en tant qu’argument d’entrée à la procédure.
Remarque
La sp_invoke_external_rest_endpoint
procédure stockée est en préversion pour SQL Server 2025 (17.x) Preview.
Moyens d’atténuer les risques d’accès non autorisé ou de transfert de données
Avertissement
L’utilisation de la procédure stockée sp_invoke_external_rest_endpoint
permet le transfert de données vers une entité externe.
Pour atténuer le risque d’accès non autorisé ou de transfert de données, tenez compte des meilleures pratiques de sécurité suivantes :
- Implémenter des contrôles d’accès forts: assurez-vous que seuls les utilisateurs autorisés ont accès aux données sensibles et aux points de terminaison d’API REST. Utilisez le principe de des privilèges minimum, ainsi que des rôles et des privilèges de base de données.
- l’authentification et l’autorisation appropriées: vérifiez que tous les appels REST sont authentifiés et autorisés à empêcher l’accès non autorisé.
- Surveiller et auditer l’accès: surveillez et auditez régulièrement l’accès à la base de données et aux appels d’API REST pour détecter les activités suspectes.
- évaluations de sécurité régulières: effectuez des évaluations de sécurité et des analyses de vulnérabilité régulières pour identifier et atténuer les risques potentiels.
- formation des employés: informez les employés sur les risques d’exfiltration des données et l’importance des protocoles de sécurité suivants.
Syntaxe
Conventions de la syntaxe Transact-SQL
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 ]
Les arguments
[ @url = ] N’url'
URL du point de terminaison REST HTTPS à appeler. @url est nvarchar(4000) sans valeur par défaut.
[ @payload = ] N’request_payload'
Chaîne Unicode au format JSON, XML ou TEXT qui contient la charge utile à envoyer au point de terminaison REST HTTPS. Les charges utiles doivent être un document JSON valide, un document XML bien formé ou du texte. @payload est nvarchar(max) sans valeur par défaut.
[ @headers = ] N’headers'
En-têtes qui doivent être envoyés dans le cadre de la requête au point de terminaison REST HTTPS. Les en-têtes doivent être spécifiés à l’aide d’un format JSON plat (document JSON sans structures imbriquées). Les en-têtes définis dans la liste des en-têtes interdits sont ignorés même s’ils sont transmis explicitement dans le paramètre @headers ; leurs valeurs sont ignorées ou remplacées par des valeurs fournies par le système lors du démarrage de la requête HTTPS.
Le paramètre @headers est nvarchar(4000) sans valeur par défaut.
[ @method = ] N’method'
Méthode HTTP pour appeler l’URL. Doit être l’une des valeurs suivantes : GET
, , POST
PUT
, PATCH
, DELETE
, HEAD
.
@method est nvarchar(6) avec POST
comme valeur par défaut.
[ @timeout = ] secondes
Durée en secondes autorisée pour l’exécution de l’appel HTTPS. Si la requête et la réponse HTTP complètes ne peuvent pas être envoyées et reçues dans le délai d’expiration défini en secondes, l’exécution de la procédure stockée est interrompue et une exception est levée. Le délai d’expiration démarre lorsque la connexion HTTP démarre et se termine lorsque la réponse et la charge utile incluses le cas échéant ont été reçues. @timeout est un petitint positif avec une valeur par défaut 30. Valeurs acceptées : 1 à 230.
[ @credential = ] informations d’identification
Indiquez l’objet DATABASE SCOPED CREDENTIAL utilisé pour injecter des informations d’authentification dans la requête HTTPS. @credential est sysname sans valeur par défaut.
@response SORTIE
Autorisez la réponse reçue du point de terminaison appelé à être transmise à la variable spécifiée. @response est nvarchar(max).
Valeur retournée
L’exécution retourne 0
si l’appel HTTPS a été effectué et que le code d’état HTTP reçu est un code d’état 2xx (Success
). Si le code d’état HTTP reçu n’est pas dans la plage 2xx, la valeur de retour est le code d’état HTTP reçu. Si l’appel HTTPS ne peut pas être effectué du tout, une exception est levée.
autorisations
Autorisations de base de données
Nécessite l’autorisation EXECUTE ANY EXTERNAL ENDPOINT Database.
Par exemple :
GRANT EXECUTE ANY EXTERNAL ENDPOINT TO [<PRINCIPAL>];
Activer dans SQL Server 2025 et Azure SQL Managed Instance
Remarque
La sp_invoke_external_rest_endpoint
procédure stockée est en préversion pour SQL Server 2025 (17.x) Preview.
La sp_invoke_external_rest_endpoint
procédure stockée est disponible dans SQL Server 2025 (17.x) Preview et Azure SQL Managed Instance configurée avec la stratégie de mise à jour Always-up-to-date et est désactivée par défaut.
Pour activer la sp_invoke_external_rest_endpoint
procédure stockée dans SQL Server 2025 (17.x) Preview et Azure SQL Managed Instance, exécutez le code T-SQL suivant :
EXECUTE sp_configure 'external rest endpoint enabled', 1;
RECONFIGURE WITH OVERRIDE;
sp_configure
Pour modifier une option de configuration ou pour exécuter l’instruction RECONFIGURE, un utilisateur doit disposer de l’autorisation au niveau du serveur ALTER SETTINGS. L’autorisation ALTER SETTINGS est implicitement conservée par les rôles serveur fixe sysadmin et serveradmin.
Remarque
sp_invoke_external_rest_endpoint
est activé par défaut dans Azure SQL Database et SQL Database dans Fabric.
Format de la réponse
La réponse de l’appel HTTP et les données résultantes renvoyées par le point de terminaison appelé sont disponibles via le paramètre de sortie @response . @response peut contenir un document JSON avec le schéma suivant :
{
"response": {
"status": {
"http": {
"code": "",
"description": ""
}
},
"headers": {}
},
"result": {}
}
Plus précisément :
- réponse : objet JSON qui contient le résultat HTTP et d’autres métadonnées de réponse.
-
résultat : charge utile JSON retournée par l’appel HTTP. Omis si le résultat HTTP reçu est 204 (
No Content
).
Ou le @response peut contenir un document XML avec le schéma suivant :
<output>
<response>
<status>
<http code="" description=" " />
</status>
<headers>
<header key="" value="" />
<header key="" value="" />
</headers>
</response>
<result>
</result>
</output>
Plus précisément :
- réponse : objet XML qui contient le résultat HTTP et d’autres métadonnées de réponse.
-
résultat : charge utile XML retournée par l’appel HTTP. Omis si le résultat HTTP reçu est 204 (
No Content
).
Dans la response
section, outre le code d’état HTTP et la description, l’ensemble des en-têtes de réponse reçus sont fournis dans l’objet headers
. L’exemple suivant montre une response
section au format JSON (également la structure des réponses de texte) :
"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"
}
}
L’exemple suivant montre une response
section au format 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>
Points de terminaison autorisés
Important
Cette liste s’applique uniquement à Azure SQL Database et à Azure SQL Managed Instance.
Seuls les appels aux points de terminaison pour les services suivants sont autorisés :
Service Azure | Domaine |
---|---|
Les fonctions Azure | *.azurewebsites.net |
Azure Apps Service | *.azurewebsites.net |
Environnement Azure App Service | *.appserviceenvironment.net |
Applications Web statiques Azure | *.azurestaticapps.net |
Azure Logic Apps | *.logic.azure.com |
Hubs d'événements Azure | *.servicebus.windows.net |
Azure Event Grid | *.eventgrid.azure.net |
Azure AI Services | *.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 (Instances de Conteneur Azure) | *.azurecontainer.io |
Azure Container Apps (Applications de Conteneur Azure) | *.azurecontainerapps.io |
Power BI | api.powerbi.com |
Microsoft Graph | graph.microsoft.com |
Services d'analyse | *.asazure.windows.net |
IoT Central | *.azureiotcentral.com |
Gestion des API | *.azure-api.net |
Stockage Blob Azure | *.blob.core.windows.net |
Azure Files | *.file.core.windows.net |
Stockage File d’attente Azure | *.queue.core.windows.net |
Stockage de tables Azure | *.table.core.windows.net |
Azure Communication Services | *.communications.azure.com |
Recherche Bing | api.bing.microsoft.com |
Azure Key Vault | *.vault.azure.net |
Recherche d’IA Azure | *.search.windows.net |
Azure Maps | *.atlas.microsoft.com |
Azure AI Traducteur | api.cognitive.microsofttranslator.com |
Les règles de pare-feu sortantes pour azure SQL Database et le mécanisme de contrôle Azure Synapse Analytics peuvent être utilisées pour restreindre davantage l’accès sortant aux points de terminaison externes.
Remarque
Si vous souhaitez appeler un service REST qui n’est pas dans la liste autorisée, vous pouvez utiliser Gestion des API pour exposer en toute sécurité le service souhaité et le rendre disponiblesp_invoke_external_rest_endpoint
.
Limites
Taille de charge utile
La charge utile, lorsqu’elle est reçue et envoyée, est encodée en UTF-8 lorsqu’elle est envoyée sur le câble. Dans ce format, sa taille est limitée à 100 Mo.
Longueur de l’URL
La longueur maximale de l’URL (générée après l’utilisation du paramètre @url et l’ajout des informations d’identification spécifiées à la chaîne de requête, le cas échéant) est de 8 Ko ; la longueur maximale de la chaîne de requête (chaîne de requête + chaîne de requête d’informations d’identification) est de 4 Ko.
Taille des en-têtes
La taille maximale des en-têtes de requête et de réponse (tous les champs d’en-tête d’en-têtes transmis via @headers paramètre + en-tête d’informations d’identification + en-têtes fournis par le système) est de 8 Ko.
Limitation
Le nombre de connexions simultanées à des points de terminaison externes effectués via sp_invoke_external_rest_endpoint
sont limitées à 10 % des threads de travail, avec un maximum de 150 workers. Sur une limitation de base de données unique est appliquée au niveau de la base de données, tandis que sur une limitation de pool élastique est appliquée à la fois au niveau de la base de données et au niveau du pool.
Pour vérifier le nombre de connexions simultanées qu’une base de données peut maintenir, exécutez la requête suivante :
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();
Si une nouvelle connexion à un point de terminaison externe est sp_invoke_external_rest_endpoint
tentée lorsque les connexions simultanées maximales sont déjà atteintes, l’erreur 10928 (ou 10936 si vous avez atteint les limites des pools élastiques) est levée. Par exemple :
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.
Informations d'identification
Certains points de terminaison REST nécessitent l’authentification pour être correctement appelés. L’authentification peut généralement être effectuée en transmettant des paires clé-valeur spécifiques dans la chaîne de requête ou dans les en-têtes HTTP définis avec la requête.
Il est possible d’utiliser DATABASE SCOPED CREDENTIAL
pour stocker en toute sécurité les données d’authentification (par exemple, un jeton du porteur) à utiliser sp_invoke_external_rest_endpoint
pour appeler un point de terminaison protégé. Lors de la création du DATABASE SCOPED CREDENTIAL
, utilisez le IDENTITY
paramètre pour spécifier les données d’authentification transmises au point de terminaison appelé et comment.
IDENTITY
prend en charge quatre options :
-
HTTPEndpointHeaders
: envoyer des données d’authentification spécifiées à l’aide des en-têtes de requête -
HTTPEndpointQueryString
: envoyer des données d’authentification spécifiées à l’aide de la chaîne de requête -
Managed Identity
: envoyer l’identité managée affectée par le système à l’aide des en-têtes de requête -
Shared Access Signature
: fournir un accès délégué limité aux ressources via une URL signée (également appelée SAP)
La création DATABASE SCOPED CREDENTIAL
peut être utilisée via le paramètre @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>];
Avec cette IDENTITY
valeur, la DATABASE SCOPED CREDENTIAL
valeur est ajoutée aux en-têtes de requête. La paire clé-valeur contenant les informations d’authentification doit être fournie via le paramètre à l’aide SECRET
d’un format JSON plat. Par exemple :
CREATE DATABASE SCOPED CREDENTIAL [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>]
WITH IDENTITY = 'HTTPEndpointHeaders', SECRET = '{"x-functions-key":"<your-function-key-here>"}';
Règles de nom d’informations d’identification
Les informations d’identification d’étendue de base de données créées doivent respecter des règles spécifiques afin d’être utilisées avec sp_invoke_external_rest_endpoint
. Les règles sont les suivantes :
- Doit être un URL valide
- Le domaine d’URL doit être l’un de ces domaines inclus dans la liste verte
- L’URL ne doit pas contenir de chaîne de requête
- Le protocole + nom de domaine complet (FQDN) de l’URL appelée doit correspondre au protocole + nom de domaine complet du nom d’identification
- Chaque partie du chemin d’accès d’URL appelé doit correspondre complètement à la partie respective du chemin d’URL dans le nom des informations d’identification
- Les informations d’identification doivent pointer vers un chemin d’accès plus générique que l’URL de la requête. Par exemple, les informations d’identification créées pour le chemin d’accès
https://northwind.azurewebsite.net/customers
ne peuvent pas être utilisées pour l’URLhttps://northwind.azurewebsite.net
Règles de nom de classement et d’informations d’identification
RFC 3986 Section 6.2.2.1 indique que « Lorsqu’un URI utilise des composants de la syntaxe générique, les règles d’équivalence de syntaxe des composants s’appliquent toujours ; à savoir que le schéma et l’hôte ne respectent pas la casse », et la section RFC 7230, section 2.7.3 mentionne que « toutes les autres sont comparées de manière sensible à la casse ».
Comme il existe un ensemble de règles de classement au niveau de la base de données, la logique suivante est appliquée, pour être cohérente avec la règle de classement de base de données et la RFC mentionnée ci-dessus. (La règle décrite peut être plus restrictive que les règles RFC, par exemple si la base de données est définie pour utiliser un classement respectant la casse.) :
- Vérifiez si l’URL et les informations d’identification correspondent à l’aide du RFC, ce qui signifie :
- Vérifiez le schéma et l’hôte à l’aide d’un classement non sensible à la casse (
Latin1_General_100_CI_AS_KS_WS_SC
) - Vérifiez que tous les autres segments de l’URL sont comparés dans un classement respectant la casse (
Latin1_General_100_BIN2
)
- Vérifiez le schéma et l’hôte à l’aide d’un classement non sensible à la casse (
- Vérifiez que l’URL et les informations d’identification correspondent à l’aide des règles de classement de base de données (et sans effectuer d’encodage d’URL).
Accorder des autorisations pour l’utilisation d’informations d’identification
Les utilisateurs de base de données qui accèdent à des informations d’identification DATABASE SCOPED doivent avoir l’autorisation d’utiliser ces informations d’identification.
Pour utiliser les informations d’identification, un utilisateur de base de données doit disposer REFERENCES
d’une autorisation sur des informations d’identification spécifiques :
GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[<CREDENTIAL_NAME>] TO [<PRINCIPAL>];
Notes
Type d’attente
Lorsque sp_invoke_external_rest_endpoint
l’appel au service appelé est terminé, il signale un type d’attente HTTP_EXTERNAL_CONNECTION
.
HTTPS et TLS
Seuls les points de terminaison configurés pour utiliser HTTPS avec le protocole de chiffrement TLS sont pris en charge.
Redirections HTTP
sp_invoke_external_rest_endpoint
ne suit pas automatiquement une redirection HTTP reçue en tant que réponse du point de terminaison appelé.
En-têtes HTTP
sp_invoke_external_rest_endpoint
injecte automatiquement les en-têtes suivants dans la requête HTTP :
-
content-type : défini sur
application/json; charset=utf-8
-
accept : défini sur
application/json
-
user-agent : défini
<EDITION>/<PRODUCT VERSION>
par exemple :SQL Azure/12.0.2000.8
Bien que l’agent utilisateur soit toujours remplacé par la procédure stockée, les valeurs d’en-tête de type de contenu et d’acceptation peuvent être définies par l’utilisateur via le paramètre @headers . Seule la directive de type multimédia est autorisée à être spécifiée dans le type de contenu et la spécification des directives de charset ou de limite n’est pas possible.
Types de supports pris en charge par la charge utile de demande et de réponse
Les valeurs suivantes sont acceptées pour le type de contenu d’en-tête.
- application/json
- application/vnd.microsoft.*.json
- application/xml
- application/vnd.microsoft.*.xml
- application/vnd.microsoft.*+xml
- application/x-www-form-urlencoded
- SMS/*
Pour l’en-tête d’acceptation, voici les valeurs acceptées.
- application/json
- application/xml
- SMS/*
Pour plus d’informations sur les types d’en-têtes de texte, consultez le registre de types de texte sur IANA.
Remarque
Si vous testez l’appel du point de terminaison REST avec d’autres outils, tels que cURL ou n’importe quel client REST moderne comme Insomnie, veillez à inclure les mêmes en-têtes qui sont automatiquement injectés par sp_invoke_external_rest_endpoint
le même comportement et les mêmes résultats.
Bonnes pratiques
Utiliser une technique de traitement par lots
Si vous devez envoyer un ensemble de lignes à un point de terminaison REST, par exemple à une fonction Azure ou à un hub d’événements, il est recommandé de regrouper les lignes dans un document JSON unique, afin d’éviter la surcharge d’appel HTTPS pour chaque ligne envoyée. Pour ce faire, utilisez l’instruction FOR JSON
, par exemple :
-- 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;
Exemples
Vous trouverez ici quelques exemples sur l’utilisation sp_invoke_external_rest_endpoint
de l’intégration à des services Azure courants tels qu’Azure Functions ou Azure Event Hubs. Vous trouverez d’autres exemples à intégrer à d’autres services sur GitHub.
R : Appeler une fonction Azure à l’aide d’une liaison de déclencheur HTTP sans authentification
L’exemple suivant appelle une fonction Azure à l’aide d’une liaison de déclencheur HTTP autorisant l’accès anonyme.
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. Appeler une fonction Azure à l’aide d’une liaison de déclencheur HTTP avec une clé d’autorisation
L’exemple suivant appelle une fonction Azure à l’aide d’une liaison de déclencheur HTTP configurée pour exiger une clé d’autorisation. La clé d’autorisation est passée dans l’en-tête x-function-key
, comme requis par Azure Functions. Pour plus d’informations, consultez Azure Functions - Autorisation de clé 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;
Chapitre C. Lire le contenu d’un fichier à partir de Stockage Blob Azure avec un jeton SAP
Cet exemple lit un fichier à partir de Stockage Blob Azure à l’aide d’un jeton SAP pour l’authentification. Les résultats sont retournés au format XML. Vous devez donc utiliser l’en-tête "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. Envoyer un message à un hub d’événements à l’aide de l’identité managée Azure SQL Database
Cet exemple montre comment envoyer des messages à Event Hubs à l’aide de l’identité managée Azure SQL. Vérifiez que vous avez configuré l’identité managée système pour le serveur logique Azure SQL Database hébergeant votre base de données, par exemple :
az sql server update -g <resource-group> -n <azure-sql-server> --identity-type SystemAssigned
Ensuite, configurez Event Hubs pour permettre à l’identité managée d’Azure SQL Server d’envoyer des messages (« rôle Expéditeur de données Azure Event Hubs ») au hub d’événements souhaité. Pour plus d’informations, consultez Utiliser Event Hubs avec des identités managées.
Une fois cette opération effectuée, vous pouvez utiliser le Managed Identity
nom d’identité lors de la définition des informations d’identification délimitées à la base de données utilisées par sp_invoke_external_rest_endpoint
. Comme expliqué dans Authentifier une application avec l’ID Microsoft Entra pour accéder aux ressources Event Hubs, le nom de la ressource (ou l’ID) à utiliser lors de l’utilisation de l’authentification Microsoft Entra est 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. Lire et écrire un fichier dans stockage de fichiers Azure avec des informations d’identification délimitées à Azure SQL Database
Cet exemple écrit un fichier dans un stockage de fichiers Azure à l’aide d’informations d’identification délimitées à Azure SQL Database pour l’authentification, puis retourne le contenu. Les résultats sont retournés au format XML. Vous devez donc utiliser l’en-tête "Accept":"application/xml"
.
Commencez par créer une clé principale pour la base de données Azure SQL. Remplacez par <password>
un mot de passe fort.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO
Ensuite, créez les informations d’identification délimitées à la base de données à l’aide du jeton SAP fourni par le compte Stockage Blob Azure. Remplacez <token>
par le jeton SAP fourni.
CREATE DATABASE SCOPED CREDENTIAL [filestore]
WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<token>';
GO
Ensuite, créez le fichier et ajoutez du texte à celui-ci avec les deux instructions suivantes. Remplacez par <domain>
le chemin approprié.
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
Enfin, utilisez l’instruction suivante pour lire le fichier. Remplacez par <domain>
le chemin approprié.
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. Appeler azure OpenAI à l’aide d’Une identité managée
L’exemple suivant appelle un modèle Azure OpenAI à l’aide d’identités managées dans Microsoft Entra pour Azure SQL. Remplacez et <my-azure-openai-endpoint>
utilisez <model-deployment-name>
respectivement votre point de terminaison Azure OpenAI et votre nom de modèle, et vérifiez que vous avez attribué le rôle d’utilisateur OpenAI Cognitive Services dans le service 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
Contenu connexe
- Gestion des ressources dans Azure SQL Database
- sys.dm_resource_governor_resource_pools_history_ex
- sys.dm_resource_governor_workload_groups_history_ex
- sys.dm_user_db_resource_governance
- GRANT – octroi d'autorisations de base de données (Transact-SQL)
- CRÉER DES INFORMATIONS D’IDENTIFICATION LIMITÉES À LA BASE DE DONNÉES (TRANSACT-SQL)
- Gestion des API
- exemples d’utilisation de sp_invoke_external_rest_endpoint