Partilhar via


Consultas entre clusters e entre bancos de dados

Aplica-se a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

As consultas são executadas com um banco de dados específico designado como o banco de dados no contexto. Esse banco de dados atua como o padrão para verificação de permissão. Se uma entidade for referenciada em uma consulta sem especificar o cluster ou banco de dados, ela será resolvida nesse banco de dados.

As consultas são executadas com um banco de dados específico designado como o banco de dados no contexto. Esse banco de dados atua como o padrão para verificação de permissão. Se uma entidade for referenciada em uma consulta sem especificar o contexto, ela será resolvida nesse banco de dados.

Este artigo explica como executar consultas que envolvem entidades localizadas fora do banco de dados de contexto atual.

Pré-requisitos

Identificar o cluster e o banco de dados no contexto

Identifique a casa de eventos e o banco de dados no contexto

A tabela a seguir explica como identificar o banco de dados no contexto por ambiente de consulta.

Ambiente Banco de dados em contexto
Kusto Explorer O banco de dados padrão é aquele selecionado no painel de conexões e o cluster atual é o cluster que contém esse banco de dados.
Interface do usuário da Web do Azure Data Explorer O banco de dados padrão é aquele selecionado no painel de conexão e o cluster atual é o cluster que contém esse banco de dados.
Bibliotecas de clientes Especifique o banco de dados e o cluster padrão pelas Data Source propriedades e Initial Catalog das cadeias de conexão Kusto.
Ambiente Banco de dados/casa de eventos no contexto
Kusto Explorer O banco de dados padrão é aquele selecionado no painel de conexões e o evento atual
Conjunto de consultas KQL do Real-Time Intelligence O banco de dados padrão é o banco de dados atual selecionado diretamente ou por meio de um evento.
Bibliotecas de clientes Especifique o banco de dados padrão com o URI do banco de dados, usado para as Data Source propriedades das cadeias de conexão Kusto. Para o eventhouse, use seu URI de cluster. Você pode encontrá-lo selecionando Visão geral do sistema na seção Detalhes da casa de eventos da casa de eventos selecionada.

Executar consultas entre clusters ou bancos de dados

Executar consultas entre eventos ou entre bancos de dados

Para acessar entidades fora do banco de dados no contexto, use as funções cluster() e database() para qualificar o nome da entidade.

Para uma tabela em um banco de dados diferente dentro do mesmo cluster:

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

Para uma tabela em um cluster remoto:

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

Para uma tabela em um banco de dados diferente dentro da mesma casa de eventos:

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

Para uma tabela em um evento remoto

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

Observação

Para executar uma consulta, você deve ter permissão de visualizador para o banco de dados padrão e para todos os outros bancos de dados referenciados na consulta. Para obter mais informações, confira Kusto role-based access control.

Dica

O número de registros retornados de uma consulta é limitado por padrão, mesmo que não haja nenhum uso específico do take operador. Para aumentar o limite, use a opção de solicitação do cliente notruncation . Para saber mais, confira Limites de consulta.

Nomes qualificados e o operador sindical

Quando um nome qualificado aparece como um operando do operador union, os curingas podem ser usados para especificar várias tabelas e vários bancos de dados. Curingas não são permitidos em nomes de cluster.

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

Quando um nome qualificado aparece como um operando do operador union, os curingas podem ser usados para especificar várias tabelas e vários bancos de dados. Curingas não são permitidos em nomes de casas de eventos.

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

Observação

O nome do banco de dados padrão também é uma correspondência potencial, portanto database("*") , especifica todas as tabelas de todos os bancos de dados, incluindo o padrão.

Nomes qualificados e instruções de acesso restrito

Nomes ou padrões qualificados também podem ser incluídos na instrução de acesso restrito. Curingas em nomes de cluster não são permitidos.

Curingas em nomes de casas de eventos não são permitidos.

A consulta a seguir restringe o acesso de consulta às seguintes entidades:

  • Qualquer nome de entidade que comece com my... no banco de dados padrão.
  • Qualquer tabela em todos os bancos de dados chamados MyOther... do cluster atual.
  • Qualquer tabela em todos os bancos de dados chamados my2... no cluster OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
  • Qualquer nome de entidade que comece com event... no banco de dados padrão.
  • Qualquer tabela em todos os bancos de dados chamados EventOther... da casa de eventos atual.
  • Qualquer tabela em todos os bancos de dados denominada event2... no OtherEventhouse.kusto.data.microsoft.com eventhouse.
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);

Manipular alterações de esquema de entidades remotas

Para processar uma consulta entre clusters, o cluster que executa a interpretação da consulta inicial precisa ter o esquema das entidades referenciadas em clusters remotos. Para obter essas informações, um comando é enviado para recuperar os esquemas, que são armazenados em um cache.

Se houver uma alteração de esquema no cluster remoto, um esquema armazenado em cache poderá ficar desatualizado. Isso pode levar a efeitos indesejados, incluindo cenários em que colunas novas ou excluídas causam um Partial query failure. Para resolver esses problemas, atualize manualmente o esquema com o comando .clear cache remote-schema .

Para processar uma consulta de cluster entre eventos ou de casa de eventos para ADX, a casa de eventos que executa a interpretação da consulta inicial precisa ter o esquema das entidades referenciadas em casas de eventos ou clusters remotos. Para obter essas informações, um comando é enviado para recuperar os esquemas, que são armazenados em um cache.

Se houver uma alteração de esquema remoto, um esquema armazenado em cache poderá ficar desatualizado. Isso pode levar a efeitos indesejados, incluindo cenários em que colunas novas ou excluídas causam um Partial query failure. Para resolver esses problemas, atualize manualmente o esquema com o comando .clear cache remote-schema .

Funções e exibições

Funções e exibições (persistentes e criadas embutidas) podem fazer referência a tabelas entre limites de banco de dados e cluster. O código a seguir é válido.

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

Funções e exibições persistentes podem ser acessadas de outro banco de dados no mesmo cluster.

Por exemplo, digamos que você crie a seguinte função tabular (exibição) em um banco de dados OtherDb:

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

Em seguida, você cria a seguinte função escalar em um banco de dados OtherDb:

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

No banco de dados padrão, essas entidades podem ser referenciadas da seguinte maneira:

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

Funções e exibições (persistentes e criadas embutidas) podem fazer referência a tabelas entre limites de banco de dados e casa de eventos. O código a seguir é válido.

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

Funções e exibições persistentes podem ser acessadas de outro banco de dados na mesma casa de eventos.

Por exemplo, digamos que você crie a seguinte função tabular (exibição) em um banco de dados OtherDb:

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

Em seguida, você cria a seguinte função escalar em um banco de dados OtherDb:

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

Por exemplo, digamos que você crie a seguinte função tabular (exibição) em um banco de dados OtherDb:

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

Em seguida, você cria a seguinte função escalar em um banco de dados OtherDb:

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

No banco de dados padrão, essas entidades podem ser referenciadas da seguinte maneira:

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

Limitações de chamadas de função entre clusters

Funções ou exibições tabulares podem ser referenciadas entre clusters. As seguintes limitações se aplicam:

  • As funções remotas devem retornar o esquema tabular. As funções escalares só podem ser acessadas no mesmo cluster.
  • As funções remotas podem aceitar apenas argumentos escalares. As funções que obtêm um ou mais argumentos de tabela só podem ser acessadas no mesmo cluster.
  • O esquema de resultados das funções remotas deve ser corrigido (conhecido antecipadamente sem executar partes da consulta). Portanto, construções de consulta, como o pivot plug-in, não podem ser usadas. Alguns plug-ins, como o bag_unpack plug-in, dão suporte a uma maneira de indicar o esquema de resultado estaticamente e, dessa forma, ele pode ser usado em chamadas de função entre clusters.
  • Por motivos de desempenho, o cluster de chamada armazena em cache o esquema de entidades remotas após a chamada inicial. Portanto, as alterações feitas na entidade remota podem resultar em uma incompatibilidade com as informações do esquema armazenado em cache, potencialmente levando a falhas de consulta. Para obter mais informações, consulte Consultas entre clusters e alterações de esquema.

Limitações de chamadas de função entre eventos

Funções tabulares ou visualizações podem ser referenciadas em casas de eventos. As seguintes limitações se aplicam:

  • As funções remotas devem retornar o esquema tabular. As funções escalares só podem ser acessadas na mesma casa de eventos.
  • As funções remotas podem aceitar apenas argumentos escalares. As funções que obtêm um ou mais argumentos de tabela só podem ser acessadas na mesma casa de eventos.
  • O esquema de resultados das funções remotas deve ser corrigido (conhecido antecipadamente sem executar partes da consulta). Portanto, construções de consulta, como o pivot plug-in, não podem ser usadas. Alguns plug-ins, como o bag_unpack plug-in, dão suporte a uma maneira de indicar o esquema de resultado estaticamente e, dessa forma, ele pode ser usado em chamadas de função entre eventos.
  • Por motivos de desempenho, a casa de eventos de chamada armazena em cache o esquema de entidades remotas após a chamada inicial. Portanto, as alterações feitas na entidade remota podem resultar em uma incompatibilidade com as informações do esquema armazenado em cache, potencialmente levando a falhas de consulta. Para obter mais informações, consulte Consultas entre clusters e alterações de esquema.

Exemplos

A chamada entre clusters a seguir é válida.

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

A consulta a seguir chama uma função MyCalcescalar remota. Essa chamada viola a regra #1, portanto, não é válida.

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

A consulta a seguir chama a função MyCalc remota e fornece um parâmetro tabular. Essa chamada viola a regra #2, portanto, não é válida.

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

A seguinte chamada entre eventos é válida.

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

A consulta a seguir chama uma função EventCalcescalar remota. Essa chamada viola a regra #1, portanto, não é válida.

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

A consulta a seguir chama a função EventCalc remota e fornece um parâmetro tabular. Essa chamada viola a regra #2, portanto, não é válida.

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

A consulta a seguir chama a função SomeTable remota que tem uma saída de esquema variável com base no parâmetro tablename. Essa chamada viola a regra #3, portanto, não é válida.

Função tabular em OtherDb.

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

No banco de dados padrão.

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

A consulta a seguir chama a função GetDataPivot remota que tem uma saída de esquema variável com base nos dados (o plug-in pivot() tem saída dinâmica). Essa chamada viola a regra #3, portanto, não é válida.

Função tabular em OtherDb.

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

Função tabular no banco de dados padrão.

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