跨叢集和跨資料庫查詢

查詢會以指定為 內容中的資料庫的特定資料庫執行。 此資料庫可作為許可權檢查的預設值。 如果在查詢中參考實體而不指定叢集或資料庫,則會針對此資料庫解析該實體。

本文說明如何執行涉及位於目前內容資料庫外部實體的查詢。

必要條件

識別內容中的叢集和資料庫

下表說明如何依查詢環境識別內容中的資料庫。

環境 內容中的資料庫
Kusto Explorer 默認資料庫是連接 面板中選取的資料庫,而目前的叢集是包含該資料庫的叢集。
Azure Data Explorer Web UI 默認資料庫是連接 窗格中選取的資料庫,而目前的叢集是包含該資料庫的叢集。
用戶端程式庫 預設資料庫和叢集是由 Data SourceKusto 連接字串的 和 Initial Catalog 屬性所指定。

執行跨叢集或跨資料庫查詢

若要在內容中存取資料庫外部的實體,請使用 cluster () database () 函式來限定實體名稱。

針對相同叢集內不同資料庫中的數據表:

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

針對遠端叢集中的數據表:

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

注意

若要執行查詢,您必須擁有預設資料庫的檢視者許可權,以及查詢中所參考的任何其他資料庫。 如需詳細資訊,請參閱 Kusto 角色型訪問控制

提示

從查詢傳回的記錄數目預設會受到限制,即使沒有特定的 運算符使用 take 也一樣。 若要提高此限制,請使用 notruncation 用戶端要求選項。 如需詳細資訊,請參閱查詢限制

限定名稱和等位運算元

限定名稱 顯示為 等位運算子的操作數時,可以使用通配符來指定多個數據表和多個資料庫。 叢集名稱中不允許使用萬用字元。

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

注意

預設資料庫的名稱也是可能的相符專案,因此 database("*") 會指定所有資料庫的所有數據表,包括預設值。

限定名稱並限制存取語句

限定名稱或模式也可以包含在 限制存取 語句中。 不允許叢集名稱中的通配符。

下列查詢會限制下列實體的查詢存取:

  • 預設資料庫中以 my... 開頭的任何實體名稱。
  • 目前叢集名為 MyOther... 的所有資料庫的任何資料表。
  • 在叢集 OtherCluster.kusto.windows.net 中名為 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() 外掛程式具有動態輸出) 為基礎的變數結構描述輸出。 此呼叫違反規則 #3,因此無效。

OtherDb 中表格式函式。

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

預設資料庫中的表格式函式。

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