Condividi tramite


Query tra più cluster e tra più database

Si applica a: ✅Microsoft Fabric✅Azure Esplora dati Azure MonitorMicrosoft Sentinel

Le query vengono eseguite con un database specifico designato come database nel contesto. Questo database funge da impostazione predefinita per il controllo delle autorizzazioni. Se viene fatto riferimento a un'entità in una query senza specificare il cluster o il database, viene risolto in questo database.

Le query vengono eseguite con un database specifico designato come database nel contesto. Questo database funge da impostazione predefinita per il controllo delle autorizzazioni. Se viene fatto riferimento a un'entità in una query senza specificare il contesto, viene risolto in questo database.

Questo articolo illustra come eseguire query che coinvolgono entità che si trovano all'esterno del database di contesto corrente.

Prerequisiti

Identificare il cluster e il database nel contesto

Identificare la eventhouse e il database nel contesto

Nella tabella seguente viene illustrato come identificare il database nel contesto in base all'ambiente di query.

Ambiente Database nel contesto
Kusto Explorer Il database predefinito è quello selezionato nel pannello connessioni e il cluster corrente è il cluster contenente tale database.
Interfaccia utente Web di Azure Esplora dati Il database predefinito è quello selezionato nel riquadro di connessione e il cluster corrente è il cluster contenente tale database.
Librerie client Specificare il database e il cluster predefiniti in base alle Data Source proprietà e Initial Catalog dei stringa di connessione Kusto.
Ambiente Database/Eventhouse nel contesto
Kusto Explorer Il database predefinito è quello selezionato nel pannello connessioni e la eventhouse corrente è la eventhouse contenente tale database.
Queryset KQL di Intelligence in tempo reale Il database predefinito è il database corrente selezionato direttamente o tramite una eventhouse.
Librerie client Specificare il database predefinito con l'URI del database, usato per le Data Source proprietà dei stringa di connessione Kusto. Per la eventhouse, usare il relativo URI del cluster. Per trovarla, selezionare Panoramica del sistema nella sezione Dettagli dell'evento per la casa eventi selezionata.

Eseguire query tra cluster o tra database

Eseguire query tra più eventi o tra database

Per accedere alle entità esterne al database nel contesto, usare le funzioni cluster() e database() per qualificare il nome dell'entità.

Per una tabella in un database diverso all'interno dello stesso cluster:

database("<DatabaseName>").<TableName>

Per una tabella in un cluster remoto:

cluster("<ClusterName>").database("<DatabaseName>").<TableName>

Per una tabella in un database diverso all'interno della stessa eventhouse:

database("<DatabaseName>").<TableName>

Per una tabella in una eventhouse remota o in un cluster remoto (ad esempio azure Esplora dati):

cluster("<EventhouseClusterURI>").database("<DatabaseName>").<TableName>

Nota

Per eseguire una query, è necessario disporre dell'autorizzazione visualizzatore per il database predefinito e per tutti gli altri database a cui viene fatto riferimento nella query. Per altre informazioni, vedere Controllo degli accessi in base al ruolo di Kusto.

Suggerimento

Il numero di record restituiti da una query è limitato per impostazione predefinita, anche se non esiste un uso specifico dell'operatore take . Per aumentare questo limite, usare l'opzione di richiesta client notruncation . Per altre informazioni, vedere Limiti delle query.

Nomi qualificati e operatore union

Quando un nome completo viene visualizzato come operando dell'operatore union, è possibile usare i caratteri jolly per specificare più tabelle e più database. I caratteri jolly non sono consentiti nei nomi dei cluster.

union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*

Quando un nome completo viene visualizzato come operando dell'operatore union, è possibile usare i caratteri jolly per specificare più tabelle e più database. I caratteri jolly non sono consentiti nei nomi delle case eventi.

union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherEventhouseClusterURI").database("*").*

Nota

Il nome del database predefinito è anche una potenziale corrispondenza, quindi database("*") specifica tutte le tabelle di tutti i database, incluso il valore predefinito.

Nomi qualificati e istruzioni di accesso limitati

I nomi o i modelli qualificati possono essere inclusi anche nell'istruzione limita l'accesso . I caratteri jolly nei nomi dei cluster non sono consentiti.

I caratteri jolly nei nomi delle case eventi non sono consentiti.

La query seguente limita l'accesso alle query alle entità seguenti:

  • Qualsiasi nome di entità a partire da my... nel database predefinito.
  • Qualsiasi tabella in tutti i database denominati MyOther... del cluster corrente.
  • Qualsiasi tabella in tutti i database denominati my2... nel cluster OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
  • Qualsiasi nome di entità che inizia con l'evento ... nel database predefinito.
  • Qualsiasi tabella in tutti i database denominati EventOther... della eventhouse corrente.
  • Qualsiasi tabella in tutti i database denominati event2... nella OtherEventhouse.kusto.data.microsoft.com dell'evento.
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);

Gestire le modifiche dello schema delle entità remote

Per elaborare una query tra cluster, il cluster che esegue l'interpretazione iniziale delle query deve avere lo schema delle entità a cui si fa riferimento nei cluster remoti. Per ottenere queste informazioni, viene inviato un comando per recuperare gli schemi, che vengono quindi archiviati in una cache.

Se si verifica una modifica dello schema nel cluster remoto, uno schema memorizzato nella cache potrebbe diventare obsoleto. Ciò può causare effetti indesiderati, inclusi gli scenari in cui le colonne nuove o eliminate causano un oggetto Partial query failure. Per risolvere questi problemi, aggiornare manualmente lo schema con il comando .clear cache remote-schema .

Per elaborare una query tra case eventi o cluster da eventhouse ad ADX, l'eventhouse che esegue l'interpretazione iniziale della query deve avere lo schema delle entità a cui si fa riferimento su case eventi o cluster remoti. Per ottenere queste informazioni, viene inviato un comando per recuperare gli schemi, che vengono quindi archiviati in una cache.

Se si verifica una modifica dello schema remoto, uno schema memorizzato nella cache potrebbe diventare obsoleto. Ciò può causare effetti indesiderati, inclusi gli scenari in cui le colonne nuove o eliminate causano un oggetto Partial query failure. Per risolvere questi problemi, aggiornare manualmente lo schema con il comando .clear cache remote-schema .

Funzioni e viste

Le funzioni e le viste (persistenti e create inline) possono fare riferimento a tabelle attraverso i limiti del database e del cluster. Il codice seguente è valido.

let MyView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherCluster").database("SomeDb").Table3 on Key;
MyView | where ...

È possibile accedere a funzioni e viste persistenti da un altro database nello stesso cluster.

Si supponga, ad esempio, di creare la funzione tabulare seguente (vista) in un database OtherDb:

.create function MyView(v:string) { Table1 | where Column1 has v ...  }  

Creare quindi la funzione scalare seguente in un database OtherDb:

.create function MyCalc(a:double, b:double, c:double) { (a + b) / c }  

Nel database predefinito è possibile fare riferimento a queste entità come indicato di seguito:

database("OtherDb").MyView("exception") | extend CalCol=database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10

Funzioni e viste (persistenti e create inline) possono fare riferimento a tabelle attraverso i limiti del database e della casa eventi. Il codice seguente è valido.

let EventView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherEventhouseClusterURI").database("SomeDb").Table3 on Key;
EventView | where ...

È possibile accedere a funzioni e viste persistenti da un altro database nella stessa eventhouse.

Si supponga, ad esempio, di creare la funzione tabulare seguente (vista) in un database OtherDb:

.create function EventView(v:string) { Table1 | where Column1 has v ...  }  

Creare quindi la funzione scalare seguente in un database OtherDb:

.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }  

Si supponga, ad esempio, di creare la funzione tabulare seguente (vista) in un database OtherDb:

.create function EventView(v:string) { Table1 | where Column1 has v ...  }  

Creare quindi la funzione scalare seguente in un database OtherDb:

.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }  

Nel database predefinito è possibile fare riferimento a queste entità come indicato di seguito:

database("OtherDb").EventView("exception") | extend CalCol=database("OtherDb").EventCalc(Col1, Col2, Col3) | take 10

Limitazioni delle chiamate di funzione tra cluster

È possibile fare riferimento a funzioni o viste tabulari tra cluster. Si applicano le limitazioni seguenti:

  • Le funzioni remote devono restituire uno schema tabulare. È possibile accedere alle funzioni scalari solo nello stesso cluster.
  • Le funzioni remote possono accettare solo argomenti scalari. Le funzioni che ottengono uno o più argomenti di tabella possono essere accessibili solo nello stesso cluster.
  • Lo schema dei risultati delle funzioni remote deve essere corretto (noto in anticipo senza eseguire parti della query). I costrutti di query, ad esempio il pivot plug-in, non possono quindi essere usati. Alcuni plug-in, ad esempio il bag_unpack plug-in, supportano un modo per indicare lo schema dei risultati in modo statico e in questo formato può essere usato nelle chiamate di funzione tra cluster.
  • Per motivi di prestazioni, il cluster chiamante memorizza nella cache lo schema delle entità remote dopo la chiamata iniziale. Di conseguenza, le modifiche apportate all'entità remota potrebbero causare una mancata corrispondenza con le informazioni sullo schema memorizzate nella cache, causando potenzialmente errori di query. Per altre informazioni, vedere Query tra cluster e modifiche dello schema.

Limitazioni delle chiamate di funzione cross-eventhouse

È possibile fare riferimento a funzioni o viste tabulari tra le case eventi. Si applicano le limitazioni seguenti:

  • Le funzioni remote devono restituire uno schema tabulare. È possibile accedere alle funzioni scalari solo nella stessa eventhouse.
  • Le funzioni remote possono accettare solo argomenti scalari. Le funzioni che ottengono uno o più argomenti di tabella possono essere accessibili solo nella stessa eventhouse.
  • Lo schema dei risultati delle funzioni remote deve essere corretto (noto in anticipo senza eseguire parti della query). I costrutti di query, ad esempio il pivot plug-in, non possono quindi essere usati. Alcuni plug-in, ad esempio il bag_unpack plug-in, supportano un modo per indicare lo schema dei risultati in modo statico e in questo formato può essere usato nelle chiamate di funzione cross-eventhouse.
  • Per motivi di prestazioni, la eventhouse chiamante memorizza nella cache lo schema delle entità remote dopo la chiamata iniziale. Di conseguenza, le modifiche apportate all'entità remota potrebbero causare una mancata corrispondenza con le informazioni sullo schema memorizzate nella cache, causando potenzialmente errori di query. Per altre informazioni, vedere Query tra cluster e modifiche dello schema.

Esempi

La chiamata tra cluster seguente è valida.

cluster("OtherCluster").database("SomeDb").MyView("exception") | count

La query seguente chiama una funzione MyCalcscalare remota. Questa chiamata viola la regola 1, quindi non è valida.

MyTable | extend CalCol=cluster("OtherCluster").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10

La query seguente chiama la funzione MyCalc remota e fornisce un parametro tabulare. Questa chiamata viola la regola n. 2, quindi non è valida.

cluster("OtherCluster").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )

La chiamata cross-eventhouse seguente è valida.

cluster("OtherEventhouseURI").database("SomeDb").EventView("exception") | count

La query seguente chiama una funzione EventCalcscalare remota. Questa chiamata viola la regola 1, quindi non è valida.

Eventtable | extend CalCol=cluster("OtherEventhouseClusterURI").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10

La query seguente chiama la funzione EventCalc remota e fornisce un parametro tabulare. Questa chiamata viola la regola n. 2, quindi non è valida.

cluster("EventhouseClusterURI").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )

La query seguente chiama la funzione SomeTable remota con un output dello schema variabile basato sul parametro tablename. Questa chiamata viola la regola 3, quindi non è valida.

Funzione tabulare in OtherDb.

.create function SomeTable(tablename:string) { table(tablename)  }  

Nel database predefinito.

cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")
cluster("OtherEventhouseClusterURI").database("OtherDb").SomeTable("EventTable")

La query seguente chiama la funzione GetDataPivot remota con un output dello schema variabile basato sui dati (plug-in pivot() con output dinamico. Questa chiamata viola la regola 3, quindi non è valida.

Funzione tabulare in OtherDb.

.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }  

Funzione tabulare nel database predefinito.

cluster("OtherCluster").database("OtherDb").GetDataPivot()
cluster("OtherEventhouseClusterURI").database("OtherDb").GetDataPivot()