Cluster- und datenbankübergreifende Abfragen
Gilt für: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Abfragen werden mit einer bestimmten Datenbank ausgeführt, die als Datenbank im Kontext festgelegt ist. Diese Datenbank fungiert als Standard für die Berechtigungsüberprüfung. Wenn in einer Abfrage auf eine Entität verwiesen wird, ohne den Cluster oder die Datenbank anzugeben, wird sie für diese Datenbank aufgelöst.
Abfragen werden mit einer bestimmten Datenbank ausgeführt, die als Datenbank im Kontext festgelegt ist. Diese Datenbank fungiert als Standard für die Berechtigungsüberprüfung. Wenn in einer Abfrage auf eine Entität verwiesen wird, ohne den Kontext anzugeben, wird sie für diese Datenbank aufgelöst.
In diesem Artikel wird erläutert, wie Abfragen ausgeführt werden, die Entitäten betreffen, die sich außerhalb der aktuellen Kontextdatenbank befinden.
Voraussetzungen
- Wenn sich die Cluster in verschiedenen Mandanten befinden, befolgen Sie die Anweisungen in "Mandantenübergreifende Abfragen und Befehle zulassen".
Identifizieren des Clusters und der Datenbank im Kontext
Identifizieren des Ereignishauses und der Datenbank im Kontext
In der folgenden Tabelle wird erläutert, wie Sie die Datenbank im Kontext nach Abfrageumgebung identifizieren.
Environment | Datenbank im Kontext |
---|---|
Kusto-Explorer | Die Standarddatenbank ist die im Verbindungsbereich ausgewählte Datenbank, und der aktuelle Cluster ist der Cluster, der diese Datenbank enthält. |
Webbenutzeroberfläche von Azure Data Explorer | Die Standarddatenbank ist die im Verbindungsbereich ausgewählte Datenbank, und der aktuelle Cluster ist der Cluster, der diese Datenbank enthält. |
Clientbibliotheken | Geben Sie die Standarddatenbank und den Cluster nach den Data Source Eigenschaften Initial Catalog der Kusto-Verbindungszeichenfolge s an. |
Environment | Datenbank/Eventhouse im Kontext |
---|---|
Kusto-Explorer | Die Standarddatenbank ist die im Verbindungsbereich ausgewählte Datenbank, und das aktuelle Eventhouse ist das Ereignishaus, das diese Datenbank enthält. |
KQL-Abfrageset für Echtzeitintelligenz | Die Standarddatenbank ist die aktuelle Datenbank, die entweder direkt oder über ein Eventhouse ausgewählt ist. |
Clientbibliotheken | Geben Sie die Standarddatenbank mit dem Datenbank-URI an, die für die Data Source Eigenschaften der Kusto-Verbindungszeichenfolge s verwendet wird. Verwenden Sie für das Eventhouse den Cluster-URI. Sie finden es, indem Sie im Abschnitt "Eventhouse-Details" für das ausgewählte Eventhouse die Option "Systemübersicht" auswählen. |
Durchführen von clusterübergreifenden oder datenbankübergreifenden Abfragen
Durchführen von datenbankübergreifenden oder datenbankübergreifenden Abfragen
Um auf Entitäten außerhalb der Datenbank im Kontext zuzugreifen, verwenden Sie die Cluster- und Datenbankfunktionen(), um den Entitätsnamen zu qualifizieren.
Für eine Tabelle in einer anderen Datenbank innerhalb desselben Clusters:
database("<DatabaseName>").<TableName>
Für eine Tabelle in einem Remotecluster:
cluster("<ClusterName>").database("<DatabaseName>").<TableName>
Für eine Tabelle in einer anderen Datenbank innerhalb desselben Eventhouses:
database("<DatabaseName>").<TableName>
Für eine Tabelle in einem Remoteereignishaus oder Remotedienst (z. B. Azure Data Explorer)-Cluster:
cluster("<EventhouseClusterURI>").database("<DatabaseName>").<TableName>
Hinweis
Zum Ausführen einer Abfrage benötigen Sie die Anzeigeberechtigung für die Standarddatenbank und für jede andere Datenbank, auf die in der Abfrage verwiesen wird. Weitere Informationen finden Sie unter Rollenbasierte Zugriffssteuerung mit Kusto.
Tipp
Die Anzahl der datensätze, die von einer Abfrage zurückgegeben werden, ist standardmäßig eingeschränkt, auch wenn kein bestimmter Operator verwendet take
wird. Um diese Begrenzung aufzuheben, verwenden Sie die Clientanforderungsoption notruncation
. Weitere Informationen finden Sie unter Abfragegrenzwerte.
Qualifizierte Namen und der Vereinigungsoperator
Wenn ein qualifizierter Name als Operand des Union-Operators angezeigt wird, können Platzhalter verwendet werden, um mehrere Tabellen und mehrere Datenbanken anzugeben. In Clusternamen sind keine Wildcards zulässig.
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*
Wenn ein qualifizierter Name als Operand des Union-Operators angezeigt wird, können Platzhalter verwendet werden, um mehrere Tabellen und mehrere Datenbanken anzugeben. Wildcards sind in Ereignishausnamen nicht zulässig.
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherEventhouseClusterURI").database("*").*
Hinweis
Der Name der Standarddatenbank ist auch eine potenzielle Übereinstimmung, sodass database("*")
alle Tabellen aller Datenbanken einschließlich der Standardeinstellung angegeben werden.
Qualifizierte Namen und Zugriffsanweisungen einschränken
Qualifizierte Namen oder Muster können auch in die Zugriffseinschränkungsanweisung eingeschlossen werden. Wildcards in Clusternamen sind nicht zulässig.
Wildcards in Ereignishausnamen sind nicht zulässig.
Die folgende Abfrage schränkt den Abfragezugriff auf die folgenden Entitäten ein:
- Jeder Entitätsname, der mit my... in der Standarddatenbank beginnt.
- Eine beliebige Tabelle in allen Datenbanken mit dem Namen MyOther... des aktuellen Clusters.
- Eine beliebige Tabelle in allen Datenbanken mit dem Namen my2... im Cluster OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
- Jeder Entitätsname, der mit "event" beginnt... in der Standarddatenbank.
- Eine beliebige Tabelle in allen Datenbanken mit dem Namen EventOther... des aktuellen Eventhouses.
- Eine beliebige Tabelle in allen Datenbanken mit dem Namen "event2" im eventhouse-OtherEventhouse.kusto.data.microsoft.com.
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);
Behandeln von Schemaänderungen von Remoteentitäten
Um eine clusterübergreifende Abfrage zu verarbeiten, muss der Cluster, der die anfängliche Abfrageinterpretation durchführt, das Schema der Entitäten aufweisen, auf die auf Remotecluster verwiesen wird. Um diese Informationen abzurufen, wird ein Befehl gesendet, um die Schemas abzurufen, die dann in einem Cache gespeichert werden.
Wenn im Remotecluster eine Schemaänderung vorhanden ist, wird möglicherweise ein zwischengespeichertes Schema veraltet. Dies kann zu unerwünschten Effekten führen, einschließlich Szenarien, in denen neue oder gelöschte Spalten zu einer Partial query failure
Folge haben. Um solche Probleme zu beheben, aktualisieren Sie das Schema manuell mit dem Befehl ".clear cache remote-schema" .
Um eine eventhouse- oder eventhouse-to-ADX-Clusterabfrage zu verarbeiten, muss das Eventhouse, das die anfängliche Abfrageinterpretation durchführt, das Schema der Entitäten aufweisen, auf die auf Remoteereignishäuser oder Cluster verwiesen wird. Um diese Informationen abzurufen, wird ein Befehl gesendet, um die Schemas abzurufen, die dann in einem Cache gespeichert werden.
Wenn eine Remoteschemaänderung vorhanden ist, wird möglicherweise ein zwischengespeichertes Schema veraltet. Dies kann zu unerwünschten Effekten führen, einschließlich Szenarien, in denen neue oder gelöschte Spalten zu einer Partial query failure
Folge haben. Um solche Probleme zu beheben, aktualisieren Sie das Schema manuell mit dem Befehl ".clear cache remote-schema" .
Funktionen und Sichten
Funktionen und Ansichten (persistente und erstellte Inline) können auf Tabellen über Datenbank- und Clustergrenzen hinweg verweisen. Der folgende Code ist gültig.
let MyView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherCluster").database("SomeDb").Table3 on Key;
MyView | where ...
Auf persistente Funktionen und Ansichten kann über eine andere Datenbank im selben Cluster zugegriffen werden.
Angenommen, Sie erstellen die folgende tabellarische Funktion (Ansicht) in einer Datenbank OtherDb
:
.create function MyView(v:string) { Table1 | where Column1 has v ... }
Anschließend erstellen Sie die folgende skalare Funktion in einer Datenbank OtherDb
:
.create function MyCalc(a:double, b:double, c:double) { (a + b) / c }
In der Standarddatenbank können auf diese Entitäten wie folgt verwiesen werden:
database("OtherDb").MyView("exception") | extend CalCol=database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
Funktionen und Ansichten (persistente und erstellte Inline) können auf Tabellen über Datenbank- und Ereignishausgrenzen hinweg verweisen. Der folgende Code ist gültig.
let EventView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherEventhouseClusterURI").database("SomeDb").Table3 on Key;
EventView | where ...
Auf persistente Funktionen und Ansichten kann über eine andere Datenbank im selben Eventhouse zugegriffen werden.
Angenommen, Sie erstellen die folgende tabellarische Funktion (Ansicht) in einer Datenbank OtherDb
:
.create function EventView(v:string) { Table1 | where Column1 has v ... }
Anschließend erstellen Sie die folgende skalare Funktion in einer Datenbank OtherDb
:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
Angenommen, Sie erstellen die folgende tabellarische Funktion (Ansicht) in einer Datenbank OtherDb
:
.create function EventView(v:string) { Table1 | where Column1 has v ... }
Anschließend erstellen Sie die folgende skalare Funktion in einer Datenbank OtherDb
:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
In der Standarddatenbank können auf diese Entitäten wie folgt verwiesen werden:
database("OtherDb").EventView("exception") | extend CalCol=database("OtherDb").EventCalc(Col1, Col2, Col3) | take 10
Einschränkungen von Funktionsaufrufen über clusterübergreifender Funktionen
Tabellarische Funktionen oder Ansichten können über Cluster hinweg referenziert werden. Es gelten die folgenden Einschränkungen:
- Remotefunktionen müssen ein tabellarisches Schema zurückgeben. Auf skalare Funktionen kann nur im selben Cluster zugegriffen werden.
- Remotefunktionen können nur skalare Argumente akzeptieren. Auf Funktionen, die ein oder mehrere Tabellenargumente abrufen, kann nur im selben Cluster zugegriffen werden.
- Das Ergebnisschema von Remotefunktionen muss behoben werden (im Voraus bekannt, ohne Teile der Abfrage auszuführen). Daher können Abfragekonstrukte wie das
pivot
Plug-In nicht verwendet werden. Einige Plug-Ins, z. B. dasbag_unpack
Plug-In, unterstützen eine Möglichkeit, das Ergebnisschema statisch anzugeben, und in dieser Form kann es in clusterübergreifenden Funktionsaufrufen verwendet werden. - Aus Leistungsgründen speichert der aufrufende Cluster das Schema von Remoteentitäten nach dem anfänglichen Aufruf zwischen. Daher können Änderungen, die an der Remoteentität vorgenommen wurden, zu einem Konflikt mit den zwischengespeicherten Schemainformationen führen, was zu Abfragefehlern führen kann. Weitere Informationen finden Sie unter Clusterübergreifende Abfragen und Schemaänderungen.
Einschränkungen von funktionsübergreifenden Funktionsaufrufen
Tabellarische Funktionen oder Ansichten können in allen Eventhouses referenziert werden. Es gelten die folgenden Einschränkungen:
- Remotefunktionen müssen ein tabellarisches Schema zurückgeben. Auf skalare Funktionen kann nur im selben Eventhouse zugegriffen werden.
- Remotefunktionen können nur skalare Argumente akzeptieren. Auf Funktionen, die ein oder mehrere Tabellenargumente abrufen, kann nur im selben Eventhouse zugegriffen werden.
- Das Ergebnisschema von Remotefunktionen muss behoben werden (im Voraus bekannt, ohne Teile der Abfrage auszuführen). Daher können Abfragekonstrukte wie das
pivot
Plug-In nicht verwendet werden. Einige Plug-Ins, z. B. dasbag_unpack
Plug-In, unterstützen eine Möglichkeit, das Ergebnisschema statisch anzugeben, und in dieser Form kann es in ereignisübergreifenden Funktionsaufrufen verwendet werden. - Aus Leistungsgründen speichert das aufrufende Ereignishaus das Schema von Remoteentitäten nach dem anfänglichen Aufruf zwischen. Daher können Änderungen, die an der Remoteentität vorgenommen wurden, zu einem Konflikt mit den zwischengespeicherten Schemainformationen führen, was zu Abfragefehlern führen kann. Weitere Informationen finden Sie unter Clusterübergreifende Abfragen und Schemaänderungen.
Beispiele
Der folgende clusterübergreifende Aufruf ist gültig.
cluster("OtherCluster").database("SomeDb").MyView("exception") | count
Die folgende Abfrage ruft eine skalare Remotefunktion MyCalc
auf.
Dieser Aufruf verstößt gegen Regel #1, sodass er ungültig ist.
MyTable | extend CalCol=cluster("OtherCluster").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
Die folgende Abfrage ruft die Remotefunktion MyCalc
auf und stellt einen tabellarischen Parameter bereit.
Dieser Aufruf verstößt gegen Regel #2, sodass er ungültig ist.
cluster("OtherCluster").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )
Der folgende ereignisübergreifende Aufruf ist gültig.
cluster("OtherEventhouseURI").database("SomeDb").EventView("exception") | count
Die folgende Abfrage ruft eine skalare Remotefunktion EventCalc
auf.
Dieser Aufruf verstößt gegen Regel #1, sodass er ungültig ist.
Eventtable | extend CalCol=cluster("OtherEventhouseClusterURI").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
Die folgende Abfrage ruft die Remotefunktion EventCalc
auf und stellt einen tabellarischen Parameter bereit.
Dieser Aufruf verstößt gegen Regel #2, sodass er ungültig ist.
cluster("EventhouseClusterURI").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )
Die folgende Abfrage ruft Remotefunktion SomeTable
auf, die eine variable Schemaausgabe basierend auf dem Parameter tablename
aufweist.
Dieser Aufruf verstößt gegen Regel #3, sodass er ungültig ist.
Tabellarische Funktion in OtherDb
.
.create function SomeTable(tablename:string) { table(tablename) }
In der Standarddatenbank.
cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")
cluster("OtherEventhouseClusterURI").database("OtherDb").SomeTable("EventTable")
Die folgende Abfrage ruft Remotefunktion GetDataPivot
auf, die eine variable Schemaausgabe basierend auf dem Daten-Plug-In (pivot() hat eine dynamische Ausgabe.
Dieser Aufruf verstößt gegen Regel #3, sodass er ungültig ist.
Tabellarische Funktion in OtherDb
.
.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }
Tabellarische Funktion in der Standarddatenbank.
cluster("OtherCluster").database("OtherDb").GetDataPivot()
cluster("OtherEventhouseClusterURI").database("OtherDb").GetDataPivot()