複数のクラスターと複数のデータベース クエリ

クエリは、コンテキストでデータベースとして指定された特定の データベースで実行されます。 このデータベースは、アクセス許可チェックの既定として機能します。 クラスターまたはデータベースを指定せずにクエリでエンティティが参照されている場合は、このデータベースに対して解決されます。

この記事では、現在のコンテキスト データベースの外部にあるエンティティを含むクエリを実行する方法について説明します。

前提条件

コンテキストでクラスターとデータベースを識別する

次の表では、クエリ環境でコンテキスト内のデータベースを識別する方法について説明します。

環境 コンテキスト内のデータベース
Kusto Explorer 既定のデータベースは 接続パネルで選択されたデータベースであり、現在のクラスターはそのデータベースを含むクラスターです。
Azure Data Explorer の Web UI 既定のデータベースは 接続ウィンドウで選択されたデータベースであり、現在のクラスターはそのデータベースを含むクラスターです。
クライアント ライブラリ 既定のデータベースとクラスターは、Kusto 接続文字列の プロパティと Initial Catalog プロパティでData Source指定されます。

クラスター間クエリまたはデータベース間クエリを実行する

コンテキストでデータベースの外部のエンティティにアクセスするには、 cluster() 関数と database() 関数を使用してエンティティ名を修飾します。

同じクラスター内の別のデータベース内のテーブルの場合:

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

リモート クラスター内のテーブルの場合:

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

注意

クエリを実行するには、既定のデータベースと、クエリで参照されるすべてのデータベースに対するビューアー アクセス許可が必要です。 詳細については、「 Kusto のロールベースのアクセス制御」を参照してください。

ヒント

演算子の特定の使用がない場合でも、クエリから返されるレコードの take 数は既定で制限されます。 この制限を引き上げるには、 notruncation クライアント要求オプションを使います。 詳細については、「クエリの制限」を参照してください。

修飾名と共用体演算子

修飾名共用体演算子のオペランドとして表示される場合は、ワイルドカードを使用して複数のテーブルと複数のデータベースを指定できます。 クラスター名ではワイルドカードは使用できません。

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

Note

既定のデータベースの名前も一致する可能性があるため database("*") 、既定値を含むすべてのデータベースのすべてのテーブルを指定します。

修飾名と制限アクセス ステートメント

修飾名またはパターンは、 restrict access ステートメントに含めることもできます。 クラスター名のワイルドカードは使用できません。

次のクエリは、次のエンティティへのクエリ アクセスを制限します。

  • 既定のデータベースの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

クラスター間関数呼び出しの制限事項

表形式の関数またはビューは、クラスター間で参照できます。 次の制限事項が適用されます。

  • リモート関数は表形式スキーマを返す必要があります。 スカラー関数には、同じクラスター内でのみアクセスできます。
  • リモート関数では、スカラー引数のみを受け取ることができます。 1つ以上のテーブル引数を取得する関数には、同じクラスター内でのみアクセスできます。
  • リモート関数の結果スキーマは固定である必要があります (クエリの一部を実行せずに、事前に認識しておく必要があります)。 これにより、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()