跨群集或跨数据库查询

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

查询使用指定为上下文中数据库的特定数据库运行。 此数据库充当权限检查的默认数据库。 如果在查询中引用了实体而没有指定群集或数据库,则会根据此数据库进行解析。

本文说明了如何执行涉及位于当前上下文数据库之外的实体查询。

先决条件

在上下文中识别群集和数据库

下表说明了如何通过查询环境在上下文中识别数据库。

环境 上下文中的数据库
Kusto Explorer 默认数据库是在连接面板中选择的数据库,当前群集是包含该数据库的群集。
Azure 数据资源管理器 Web UI 默认数据库是在连接窗格中选择的数据库,当前群集是包含该数据库的群集。
客户端库 通过 Kusto 连接字符串Data SourceInitial Catalog 属性指定默认数据库和群集。

执行跨群集或跨数据库查询

要在上下文中访问数据库之外的实体,请使用 cluster()database() 函数限定实体名称。

对于同一群集中不同数据库中的表:

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

对于远程群集中的表:

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

注意

若要执行查询,必须对默认数据库和查询中引用的其他所有数据库具有查看权限。 有关详细信息,请参阅 Kusto 基于角色的访问控制

提示

默认情况下,从查询返回的记录数是有限的,即使没有特别使用 take 运算符。 若要提升此限制,请使用 notruncation 客户端请求选项。 有关详细信息,请参阅查询限制

限定名称和 union 运算符

限定名称”显示为 union 运算符的操作数时,可以使用通配符来指定多个表和多个数据库。 群集名称中不允许使用通配符。

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

注意

默认数据库的名称也是潜在匹配项,因此数据库 database("*") 指定所有数据库(包括默认数据库)的所有表。

限定名称和限制访问语句

限定名称或模式也可以包含在限制访问语句中。 群集名称中不允许使用通配符。

以下查询将限制对以下实体的查询访问:

  • 从默认数据库中的“my...”开始的任何实体名称。
  • 当前群集的所有名为“MyOther...”的数据库中的任何表。
  • “OtherCluster.kusto.chinacloudapi.cn”集群中所有名为“my2...”的数据库中的任何表 。
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);

处理远程实体的架构更改

要处理跨群集查询,执行初始查询解释的群集需要具有远程群集上引用的实体架构。 为了获得这些信息,系统将发送命令来检索架构,然后将这些架构存储在缓存中。

如果远程群集中的架构发生更改,缓存的架构可能会过时。 这可能会导致不期望的效果,包括新列或已删除列导致 Partial query failure 的情况。 若要解决此类问题,请使用 .clear cache remote-schema 命令手动刷新架构。

函数和视图

函数和视图(永久的和内联创建的)可以跨数据库和群集边界引用表。 以下代码是有效的。

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

可以从同一集群中的另一个数据库访问永久函数和视图。

例如,假设在数据库 OtherDb 中创建以下表格函数(视图):

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

然后,在数据库 OtherDb 中创建以下标量函数:

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

在默认数据库中,可以按如下方式引用这些实体:

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

跨群集函数调用的限制

可以跨群集引用的表格函数或视图。 以下限制适用:

  • 远程函数必须返回表格架构。 标量函数仅能在同一个集群中访问。
  • 远程函数只能接受标量参数。 获取一个或多个表参数的函数只能在同一群集中访问。
  • 远程函数的结果架构必须是固定的(事先已知,而无需执行部分查询)。 因此不能使用 pivot 插件等查询构造。 一些插件(如 bag_unpack 插件)支持静态指示结果架构的方式,并且它以这种形式用于跨群集函数调用。
  • 出于性能考虑,调用群集会在首次调用后缓存远程实体的架构。 因此,对远程实体所做的更改可能会导致与缓存的架构信息不匹配,从而可能会导致查询失败。 有关详细信息,请参阅跨群集查询和架构更改

示例

以下跨群集调用有效。

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

以下查询调用远程标量函数 MyCalc。 此调用违反规则 #1,因此无效。

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

以下查询调用远程函数 MyCalc 并提供表格参数。 此调用违反规则 #2,因此无效。

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

以下查询调用远程函数 SomeTable,该函数具有基于参数 tablename 的变量架构输出。 此调用违反规则 #3,因此无效。

OtherDb 中的表格函数。

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

在默认数据库中。

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

以下查询调用远程函数 GetDataPivot,该函数具有基于数据(pivot() plugin 具有动态输出)的可变架构输出。 此调用违反规则 #3,因此无效。

OtherDb 中的表格函数。

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

默认数据库中的表格函数。

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