Requêtes entre plusieurs clusters et bases de données
S’applique à : ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Les requêtes s’exécutent avec une base de données particulière désignée comme base de données dans le contexte. Cette base de données agit comme valeur par défaut pour la vérification des autorisations. Si une entité est référencée dans une requête sans spécifier le cluster ou la base de données, elle est résolue par rapport à cette base de données.
Les requêtes s’exécutent avec une base de données particulière désignée comme base de données dans le contexte. Cette base de données agit comme valeur par défaut pour la vérification des autorisations. Si une entité est référencée dans une requête sans spécifier le contexte, elle est résolue sur cette base de données.
Cet article explique comment exécuter des requêtes qui impliquent des entités situées en dehors de la base de données de contexte actuelle.
Prérequis
- Si les clusters se trouvent dans différents locataires, suivez les instructions fournies dans Autoriser les requêtes et commandes interlocataires.
Identifier le cluster et la base de données dans le contexte
Identifier l’eventhouse et la base de données dans le contexte
Le tableau suivant explique comment identifier la base de données dans le contexte par environnement de requête.
Environment | Base de données dans le contexte |
---|---|
Kusto Explorer | La base de données par défaut est celle sélectionnée dans le panneau connexions, et le cluster actuel est le cluster contenant cette base de données. |
Interface utilisateur web Azure Data Explorer | La base de données par défaut est celle sélectionnée dans le volet de connexion, et le cluster actuel est le cluster contenant cette base de données. |
Fournisseurs de données pour la connexion à Azure Analysis Services | Spécifiez la base de données et le cluster par défaut par les Data Source propriétés et Initial Catalog les propriétés des chaîne de connexion Kusto. |
Environment | Base de données/Eventhouse dans le contexte |
---|---|
Kusto Explorer | La base de données par défaut est celle sélectionnée dans le volet connexions et l’eventhouse actuel est la base de données contenant cette base de données. |
Ensemble de requêtes KQL Real-Time Intelligence | La base de données par défaut est la base de données active sélectionnée directement ou par le biais d’un entrepôt d’événements. |
Fournisseurs de données pour la connexion à Azure Analysis Services | Spécifiez la base de données par défaut avec l’URI de base de données, utilisée pour les Data Source propriétés des chaîne de connexion Kusto. Pour l’eventhouse, utilisez son URI de cluster. Vous pouvez le trouver en sélectionnant Vue d’ensemble du système dans la section détails d’Eventhouse pour l’eventhouse sélectionné. |
Effectuer des requêtes entre clusters ou inter-bases de données
Effectuer des requêtes inter-événements ou inter-bases de données
Pour accéder aux entités en dehors de la base de données dans le contexte, utilisez les fonctions cluster() et database() pour qualifier le nom de l’entité.
Pour une table dans une autre base de données au sein du même cluster :
database("<DatabaseName>").<TableName>
Pour une table dans un cluster distant :
cluster("<ClusterName>").database("<DatabaseName>").<TableName>
Pour une table dans une autre base de données au sein du même eventhouse :
database("<DatabaseName>").<TableName>
Pour une table dans un cluster eventhouse ou un service distant (comme Azure Data Explorer) :
cluster("<EventhouseClusterURI>").database("<DatabaseName>").<TableName>
Remarque
Pour exécuter une requête, vous devez disposer de l’autorisation de visionneuse sur la base de données par défaut et sur toutes les autres bases de données référencées dans la requête. Pour plus d’informations, consultez Contrôle d’accès en fonction du rôle Kusto.
Conseil
Le nombre d’enregistrements retournés par une requête est limité par défaut, même s’il n’existe aucune utilisation spécifique de l’opérateur take
. Pour relever cette limite, utilisez l’option de requête client notruncation
. Pour plus d'informations, consultez Limites de requête.
Noms qualifiés et opérateur d’union
Lorsqu’un nom qualifié apparaît en tant qu’opérande de l’opérateur union, les caractères génériques peuvent être utilisés pour spécifier plusieurs tables et plusieurs bases de données. Les caractères génériques ne sont pas autorisés dans les noms de cluster.
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*
Lorsqu’un nom qualifié apparaît en tant qu’opérande de l’opérateur union, les caractères génériques peuvent être utilisés pour spécifier plusieurs tables et plusieurs bases de données. Les caractères génériques ne sont pas autorisés dans les noms de la maison d’événements.
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherEventhouseClusterURI").database("*").*
Remarque
Le nom de la base de données par défaut est également une correspondance potentielle. Il spécifie donc database("*")
toutes les tables de toutes les bases de données, y compris la valeur par défaut.
Noms qualifiés et restrictions d’instructions d’accès
Les noms qualifiés ou les modèles peuvent également être inclus dans l’instruction restreindre l’accès . Les caractères génériques dans les noms de cluster ne sont pas autorisés.
Les caractères génériques dans les noms d’eventhouse ne sont pas autorisés.
La requête suivante limite l’accès aux requêtes aux entités suivantes :
- Tout nom d’entité commençant par my... dans la base de données par défaut.
- Toute table de toutes les bases de données nommées MyOther... du cluster actuel.
- Toute table de toutes les bases de données nommées my2... dans le cluster OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
- Tout nom d’entité commençant par l’événement... dans la base de données par défaut.
- Toute table de toutes les bases de données nommées EventOther... de l’eventhouse actuel.
- Toute table de toutes les bases de données nommées event2... dans le OtherEventhouse.kusto.data.microsoft.com de la maison d’événements.
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);
Gérer les modifications de schéma des entités distantes
Pour traiter une requête inter-cluster, le cluster qui effectue l’interprétation initiale de la requête doit avoir le schéma des entités référencées sur des clusters distants. Pour obtenir ces informations, une commande est envoyée pour récupérer les schémas, qui sont ensuite stockés dans un cache.
S’il existe une modification de schéma dans le cluster distant, un schéma mis en cache peut devenir obsolète. Cela peut entraîner des effets indésirables, notamment des scénarios où les colonnes nouvelles ou supprimées provoquent un Partial query failure
. Pour résoudre ces problèmes, actualisez manuellement le schéma avec la commande de schéma distant du cache .clear.
Pour traiter une requête de cluster inter-eventhouse ou eventhouse-to-ADX, l’eventhouse qui effectue l’interprétation initiale de la requête doit avoir le schéma des entités référencées sur des eventhouses ou clusters distants. Pour obtenir ces informations, une commande est envoyée pour récupérer les schémas, qui sont ensuite stockés dans un cache.
S’il existe une modification de schéma distante, un schéma mis en cache peut devenir obsolète. Cela peut entraîner des effets indésirables, notamment des scénarios où les colonnes nouvelles ou supprimées provoquent un Partial query failure
. Pour résoudre ces problèmes, actualisez manuellement le schéma avec la commande de schéma distant du cache .clear.
Fonctions et affichages
Les fonctions et vues (persistantes et créées inline) peuvent référencer des tables entre les limites de base de données et de cluster. Le code suivant est valide.
let MyView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherCluster").database("SomeDb").Table3 on Key;
MyView | where ...
Les fonctions et vues persistantes sont accessibles à partir d’une autre base de données du même cluster.
Par exemple, supposons que vous créez la fonction tabulaire suivante (vue) dans une base de données OtherDb
:
.create function MyView(v:string) { Table1 | where Column1 has v ... }
Ensuite, vous créez la fonction scalaire suivante dans une base de données OtherDb
:
.create function MyCalc(a:double, b:double, c:double) { (a + b) / c }
Dans la base de données par défaut, ces entités peuvent être référencées comme suit :
database("OtherDb").MyView("exception") | extend CalCol=database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
Les fonctions et vues (persistantes et créées inline) peuvent référencer des tables entre les limites de base de données et d’entrepôt d’événements. Le code suivant est valide.
let EventView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherEventhouseClusterURI").database("SomeDb").Table3 on Key;
EventView | where ...
Les fonctions et vues persistantes sont accessibles à partir d’une autre base de données dans le même eventhouse.
Par exemple, supposons que vous créez la fonction tabulaire suivante (vue) dans une base de données OtherDb
:
.create function EventView(v:string) { Table1 | where Column1 has v ... }
Ensuite, vous créez la fonction scalaire suivante dans une base de données OtherDb
:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
Par exemple, supposons que vous créez la fonction tabulaire suivante (vue) dans une base de données OtherDb
:
.create function EventView(v:string) { Table1 | where Column1 has v ... }
Ensuite, vous créez la fonction scalaire suivante dans une base de données OtherDb
:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
Dans la base de données par défaut, ces entités peuvent être référencées comme suit :
database("OtherDb").EventView("exception") | extend CalCol=database("OtherDb").EventCalc(Col1, Col2, Col3) | take 10
Limitations des appels de fonction entre clusters
Les fonctions ou vues tabulaires peuvent être référencées entre les clusters. Les restrictions suivantes s’appliquent :
- Les fonctions distantes doivent retourner le schéma tabulaire. Les fonctions scalaires sont accessibles uniquement dans le même cluster.
- Les fonctions distantes peuvent accepter uniquement les arguments scalaires. Les fonctions qui obtiennent un ou plusieurs arguments de table sont accessibles uniquement dans le même cluster.
- Le schéma de résultat des fonctions distantes doit être résolu (connu à l’avance sans exécuter des parties de la requête). Ainsi, les constructions de requête telles que le
pivot
plug-in ne peuvent pas être utilisées. Certains plug-ins, tels que lebag_unpack
plug-in, prennent en charge un moyen d’indiquer le schéma de résultat de manière statique, et sous cette forme, il peut être utilisé dans les appels de fonction inter-cluster. - Pour des raisons de performances, le cluster appelant met en cache le schéma des entités distantes après l’appel initial. Par conséquent, les modifications apportées à l’entité distante peuvent entraîner une incompatibilité avec les informations de schéma mises en cache, ce qui peut entraîner des échecs de requête. Pour plus d’informations, consultez requêtes inter-clusters et modifications de schéma.
Limitations des appels de fonction inter-événements
Les fonctions ou vues tabulaires peuvent être référencées entre les entrepôts d’événements. Les restrictions suivantes s’appliquent :
- Les fonctions distantes doivent retourner le schéma tabulaire. Les fonctions scalaires sont accessibles uniquement dans le même eventhouse.
- Les fonctions distantes peuvent accepter uniquement les arguments scalaires. Les fonctions qui obtiennent un ou plusieurs arguments de table sont accessibles uniquement dans le même eventhouse.
- Le schéma de résultat des fonctions distantes doit être résolu (connu à l’avance sans exécuter des parties de la requête). Ainsi, les constructions de requête telles que le
pivot
plug-in ne peuvent pas être utilisées. Certains plug-ins, tels que lebag_unpack
plug-in, prennent en charge un moyen d’indiquer le schéma de résultat de manière statique, et sous cette forme, il peut être utilisé dans les appels de fonction inter-événements. - Pour des raisons de performances, l’eventhouse appelant met en cache le schéma des entités distantes après l’appel initial. Par conséquent, les modifications apportées à l’entité distante peuvent entraîner une incompatibilité avec les informations de schéma mises en cache, ce qui peut entraîner des échecs de requête. Pour plus d’informations, consultez requêtes inter-clusters et modifications de schéma.
Exemples
L’appel inter-cluster suivant est valide.
cluster("OtherCluster").database("SomeDb").MyView("exception") | count
La requête suivante appelle une fonction MyCalc
scalaire distante.
Cet appel enfreint la règle n° 1. Il n’est donc pas valide.
MyTable | extend CalCol=cluster("OtherCluster").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
La requête suivante appelle une fonction MyCalc
distante et fournit un paramètre tabulaire.
Cet appel enfreint la règle n° 2. Il n’est donc pas valide.
cluster("OtherCluster").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )
L’appel inter-événements suivant est valide.
cluster("OtherEventhouseURI").database("SomeDb").EventView("exception") | count
La requête suivante appelle une fonction EventCalc
scalaire distante.
Cet appel enfreint la règle n° 1. Il n’est donc pas valide.
Eventtable | extend CalCol=cluster("OtherEventhouseClusterURI").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
La requête suivante appelle une fonction EventCalc
distante et fournit un paramètre tabulaire.
Cet appel enfreint la règle n° 2. Il n’est donc pas valide.
cluster("EventhouseClusterURI").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )
La requête suivante appelle une fonction SomeTable
distante qui a une sortie de schéma variable basée sur le paramètre tablename
.
Cet appel enfreint la règle n° 3. Il n’est donc pas valide.
Fonction tabulaire en OtherDb
.
.create function SomeTable(tablename:string) { table(tablename) }
Dans la base de données par défaut.
cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")
cluster("OtherEventhouseClusterURI").database("OtherDb").SomeTable("EventTable")
La requête suivante appelle une fonction GetDataPivot
distante qui a une sortie de schéma variable basée sur le plug-in de données (pivot() a une sortie dynamique.
Cet appel enfreint la règle n° 3. Il n’est donc pas valide.
Fonction tabulaire en OtherDb
.
.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }
Fonction tabulaire dans la base de données par défaut.
cluster("OtherCluster").database("OtherDb").GetDataPivot()
cluster("OtherEventhouseClusterURI").database("OtherDb").GetDataPivot()