Interroger Cosmos DB avec Synapse SQL
Outre l’utilisation d’un pool Spark, vous pouvez interroger un conteneur analytique Azure Cosmos DB à l’aide d’un pool SQL serverless intégré dans Azure Synapse Analytics. Pour ce faire, vous pouvez utiliser la fonction SQL OPENROWSET
pour vous connecter au service lié pour votre base de données Azure Cosmos DB.
Utilisation d’OPENROWSET avec une clé d’authentification
Par défaut, l’accès à un compte Azure Cosmos DB est authentifié par une clé d’authentification. Vous pouvez utiliser cette clé dans le cadre d’une chaîne de connexion dans une instruction OPENROWSET
pour vous connecter via un service lié à partir d’un pool SQL, comme illustré dans l’exemple suivant :
SELECT *
FROM OPENROWSET(
'CosmosDB',
'Account=my-cosmos-db;Database=my-db;Key=abcd1234....==',
[my-container]) AS products_data
Conseil
Vous trouverez une clé primaire et une clé secondaire pour votre compte Cosmos DB sur sa page Clés dans le portail Azure.
Les résultats de cette requête peuvent ressembler à ce qui suit, notamment les métadonnées et les champs définis par l’application à partir des éléments du conteneur Azure Cosmos DB :
_rid | _ts | productID | ProductName | id | _etag |
---|---|---|---|---|---|
mjMaAL...== | 1655414791 | 123 | Widget | 7248f072-11c3-42b1-a368-... | 54004b09-0000-2300-... |
mjMaAL...== | 1655414829 | 124 | Wotsit | dc33131c-65c7-421a-a0f7-... | 5400ca09-0000-2300-... |
mjMaAL...== | 1655414835 | 125 | Thingumy | ce22351d-78c7-428a-a1h5-... | 5400ca09-0000-2300-... |
... | ... | ... | ... | ... | ... |
Les données sont récupérées à partir du magasin analytique et la requête n’a pas d’impact sur le magasin opérationnel.
Utilisation d’OPENROWSET avec des informations d’identification
Au lieu d’inclure la clé d’authentification dans chaque appel à OPENROWSET, vous pouvez définir des informations d’identification qui encapsulent les informations d’authentification de votre compte Cosmos DB et utiliser les informations d’identification dans les requêtes suivantes. Pour créer des informations d’identification, utilisez l’instruction CREATE CREDENTIAL
comme indiqué dans cet exemple :
CREATE CREDENTIAL my_credential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'abcd1234....==';
Une fois les informations d’identification en place, vous pouvez les utiliser dans une fonction OPENROWSET
comme suit :
SELECT *
FROM OPENROWSET(PROVIDER = 'CosmosDB',
CONNECTION = 'Account=my-cosmos-db;Database=my-db',
OBJECT = 'my-container',
SERVER_CREDENTIAL = 'my_credential'
) AS products_data
Une fois de plus, les résultats incluent les métadonnées et les champs définis par l’application à partir du magasin analytique :
_rid | _ts | productID | ProductName | id | _etag |
---|---|---|---|---|---|
mjMaAL...== | 1655414791 | 123 | Widget | 7248f072-11c3-42b1-a368-... | 54004b09-0000-2300-... |
mjMaAL...== | 1655414829 | 124 | Wotsit | dc33131c-65c7-421a-a0f7-... | 5400ca09-0000-2300-... |
mjMaAL...== | 1655414835 | 125 | Thingumy | ce22351d-78c7-428a-a1h5-... | 5400ca09-0000-2300-... |
... | ... | ... | ... | ... | ... |
Spécification d’un schéma
La syntaxe OPENROWSET
inclut une clause WITH
que vous pouvez utiliser pour définir un schéma pour l’ensemble de lignes résultant. Vous pouvez l’utiliser pour spécifier des champs individuels et affecter des types de données, comme illustré dans l’exemple suivant :
SELECT *
FROM OPENROWSET(PROVIDER = 'CosmosDB',
CONNECTION = 'Account=my-cosmos-db;Database=my-db',
OBJECT = 'my-container',
SERVER_CREDENTIAL = 'my_credential'
)
WITH (
productID INT,
productName VARCHAR(20)
) AS products_data
Dans ce cas, en supposant que les champs du magasin analytique incluent productID et productName, l’ensemble de lignes résultant ressemble au tableau suivant :
productID | ProductName |
---|---|
123 | Widget |
124 | Wotsit |
125 | Thingumy |
... | ... |
Vous pouvez bien sûr spécifier des noms de colonnes individuels dans la clause SELECT
(par exemple, SELECT productID, productName ...
) ; cette possibilité de spécifier des colonnes individuelles peut donc sembler limitée. Toutefois, considérez les cas où les documents JSON sources stockés dans le magasin opérationnel incluent plusieurs niveaux de champs, comme indiqué dans l’exemple suivant :
{
"productID": 126,
"productName": "Sprocket",
"supplier": {
"supplierName": "Contoso",
"supplierPhone": "555-123-4567"
}
"id": "62588f072-11c3-42b1-a738-...",
"_rid": "mjMaAL...==",
...
}
La clause WITH
prend en charge l’inclusion de chemins JSON explicites, ce qui vous permet de gérer les champs imbriqués et d’attribuer des alias aux noms de champs, comme illustré dans cet exemple :
SELECT *
FROM OPENROWSET(PROVIDER = 'CosmosDB',
CONNECTION = 'Account=my-cosmos-db;Database=my-db',
OBJECT = 'my-container',
SERVER_CREDENTIAL = 'my_credential'
)
WITH (
ProductNo INT '$.productID',
ProductName VARCHAR(20) '$.productName',
Supplier VARCHAR(20) '$.supplier.supplierName',
SupplierPhoneNo VARCHAR(15) '$.supplier.supplierPhone'
) AS products_data
Les résultats de cette requête incluent la ligne suivante pour le produit 126 :
ProductNo | ProductName | Fournisseur | SupplierPhoneNo |
---|---|---|---|
126 | Sprocket | Contoso | 555-123-4567 |
Création d’une vue dans une base de données
Si vous devez interroger les mêmes données fréquemment ou utiliser des outils de création de rapports et de visualisation qui s’appuient sur des instructions SELECT
qui n’incluent pas la fonction OPENROWSET
, vous pouvez utiliser une vue pour extraire les données. Pour créer une vue, vous devez créer une base de données dans laquelle la définir (les vues définies par l’utilisateur dans la base de données master ne sont pas prises en charge), comme illustré dans l’exemple suivant :
CREATE DATABASE sales_db
COLLATE Latin1_General_100_BIN2_UTF8;
GO;
USE sales_db;
GO;
CREATE VIEW products
AS
SELECT *
FROM OPENROWSET(PROVIDER = 'CosmosDB',
CONNECTION = 'Account=my-cosmos-db;Database=my-db',
OBJECT = 'my-container',
SERVER_CREDENTIAL = 'my_credential'
)
WITH (
ProductNo INT '$.productID',
ProductName VARCHAR(20) '$.productName',
Supplier VARCHAR(20) '$.supplier.supplierName',
SupplierPhoneNo VARCHAR(15) '$.supplier.supplierPhone'
) AS products_data
GO
Conseil
Lors de la création d’une base de données qui accède aux données dans Cosmos DB, il est préférable d’utiliser un classement UTF-8 pour garantir la compatibilité avec les chaînes dans Cosmos DB.
Une fois la vue créée, les utilisateurs et les applications clientes peuvent l’interroger comme n’importe quelle autre vue ou table SQL :
SELECT * FROM products;
Considérations relatives aux pools SQL serverless et à Azure Cosmos DB
Lorsque vous envisagez d’utiliser un pool SQL serverless pour interroger des données dans un magasin analytique Azure Cosmos DB, tenez compte des meilleures pratiques suivantes :
Provisionnez votre stockage analytique Azure Cosmos DB et toutes les applications clientes (par exemple Microsoft Power BI) dans la même région que le pool SQL serverless.
Les conteneurs Azure Cosmos DB peuvent être répliqués dans plusieurs régions. Si vous avez un conteneur multirégion, vous pouvez spécifier un paramètre
region
dans la chaîne de connexion OPENROWSET pour vous assurer que les requêtes sont envoyées à un réplica régional spécifique du conteneur.Lorsque vous utilisez des colonnes de chaîne, utilisez la fonction OPENROWSET avec la clause WITH explicite et spécifiez une longueur de données appropriée pour les données de chaîne.