複数のクラスターと複数のデータベース クエリ
クエリは、コンテキストでデータベースとして指定された特定の データベースで実行されます。 このデータベースは、アクセス許可チェックの既定として機能します。 クラスターまたはデータベースを指定せずにクエリでエンティティが参照されている場合は、このデータベースに対して解決されます。
この記事では、現在のコンテキスト データベースの外部にあるエンティティを含むクエリを実行する方法について説明します。
前提条件
- クラスターが異なるテナントにある場合は、「 テナント間のクエリとコマンドを許可する」の手順に従います。
コンテキストでクラスターとデータベースを識別する
次の表では、クエリ環境でコンテキスト内のデータベースを識別する方法について説明します。
環境 | コンテキスト内のデータベース |
---|---|
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()
関連コンテンツ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示