次の方法で共有


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

適用対象: ✅Microsoft FabricAzure データ エクスプローラーAzure MonitorMicrosoft Sentinel

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

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

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

前提条件

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

コンテキストでイベントハウスとデータベースを識別する

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

環境 コンテキスト内のデータベース
Kusto Explorer 既定のデータベースは、 connections パネルで選択、現在のクラスターはそのデータベースを含むクラスターです。
Azure Data Explorer の Web UI 既定のデータベースは connection ペインで選択、現在のクラスターはそのデータベースを含むクラスターです。
クライアント ライブラリ Kusto 接続文字列sData SourceプロパティとInitial Catalogプロパティで、既定のデータベースとクラスターを指定します。
環境 コンテキスト内のデータベース/Eventhouse
Kusto Explorer 既定のデータベースは connections パネルで選択され 現在のイベントハウスはそのデータベースを含むイベントハウスです。
リアルタイム インテリジェンス KQL クエリセット 既定のデータベースは、 間接的に またはイベントハウスを介して選択されている現在のデータベースです。
クライアント ライブラリ Kusto 接続文字列sData Sourceプロパティに使用する、データベース URI を使用して、既定のデータベースを指定します。 イベントハウスの場合は、そのクラスター URI を使用します。 選択したイベントハウスの Eventhouse details セクションで System Overview を選択すると表示されます。

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

クロスイベントハウスクエリまたはデータベース間クエリを実行する

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

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

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

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

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

同じイベントハウス内の別のデータベース内のテーブルの場合:

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

リモート イベントハウスまたはリモート サービス (Azure Data Explorer など) クラスター内のテーブルの場合:

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

Note

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

ヒント

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

修飾名と共用体演算子

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

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

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

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

Note

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

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

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

イベントハウス名のワイルドカードは使用できません。

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

  • 既定のデータベースのmy...で始まる任意のエンティティ名。
  • 現在のクラスターのMyOther...という名前のすべてのデータベース内の任意のテーブル。
  • OtherCluster.kusto.windows.netというクラスター内のmy2... という名前のすべてのデータベース内の任意のテーブル。
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
  • 既定のデータベースの event... で始まる任意のエンティティ名。
  • 現在のイベントハウスの EventOther... という名前のすべてのデータベース内のすべてのテーブル。
  • eventhouse OtherEventhouse.kusto.data.microsoft.comevent2... という名前のすべてのデータベース内のテーブル。
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);

リモート エンティティのスキーマ変更を処理する

クラスター間クエリを処理するには、最初のクエリ解釈を実行するクラスターに、リモート クラスターで参照されるエンティティのスキーマが必要です。 この情報を取得するために、スキーマを取得するコマンドが送信され、キャッシュに格納されます。

リモート クラスターでスキーマが変更された場合、キャッシュされたスキーマが古くなる可能性があります。 これにより、新しい列や削除された列によって Partial query failureが発生するシナリオなど、望ましくない影響が生じる可能性があります。 このような問題を解決するには、 .clear cache remote-schema コマンドを使用してスキーマを手動で更新します。

クロスイベントハウスまたは eventhouse-to-ADX クラスター クエリを処理するには、最初のクエリ解釈を実行するイベントハウスに、リモート イベントハウスまたはクラスターで参照されるエンティティのスキーマが必要です。 この情報を取得するために、スキーマを取得するコマンドが送信され、キャッシュに格納されます。

リモート スキーマの変更が発生した場合、キャッシュされたスキーマが古くなる可能性があります。 これにより、新しい列や削除された列によって 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

関数とビュー (永続的でインラインで作成) は、データベースとイベントハウスの境界を越えてテーブルを参照できます。 次のコードは有効です。

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

永続的な関数とビューには、同じイベントハウス内の別のデータベースからアクセスできます。

たとえば、データベース OtherDbに次の表形式関数 (ビュー) を作成するとします。

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

次に、データベース OtherDbに次のスカラー関数を作成します。

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

たとえば、データベース OtherDbに次の表形式関数 (ビュー) を作成するとします。

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

次に、データベース OtherDbに次のスカラー関数を作成します。

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

既定のデータベースでは、これらのエンティティは次のように参照できます。

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

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

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

  • リモート関数は表形式スキーマを返す必要があります。 スカラー関数には、同じクラスター内でのみアクセスできます。
  • リモート関数はスカラー引数のみを受け取ることができます。 1つ以上のテーブル引数を取得する関数には、同じクラスター内でのみアクセスできます。
  • リモート関数の結果スキーマは固定である必要があります (クエリの一部を実行せずに、事前に認識しておく必要があります)。 そのため、 pivot プラグインなどのクエリ コンストラクトは使用できません。 bag_unpack プラグインなどの一部のプラグインでは、結果スキーマを静的に示す方法がサポートされており、この形式ではクラスター間の関数呼び出しで使用できます。
  • パフォーマンス上の理由から、呼び出し元のクラスターは、最初の呼び出しの後にリモート エンティティのスキーマをキャッシュします。 そのため、リモート エンティティに加えられた変更により、キャッシュされたスキーマ情報と不一致が発生し、クエリエラーが発生する可能性があります。 詳細については、「クラスター間クエリ とスキーマの変更」を参照してください。

クロスイベントハウス関数呼び出しの制限事項

表形式の関数またはビューは、イベントハウス間で参照できます。 次の制限事項が適用されます。

  • リモート関数は表形式スキーマを返す必要があります。 スカラー関数には、同じイベントハウス内でのみアクセスできます。
  • リモート関数はスカラー引数のみを受け取ることができます。 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"] )

次のイベントハウス間呼び出しは有効です。

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

次のクエリは、リモート スカラー関数EventCalcを呼び出します。 この呼び出しはルール#1に違反します。そのため、無効です。

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

次のクエリは、リモート関数EventCalcを呼び出し、表形式パラメーターを提供します。 この呼び出しはルール#2に違反します。そのため、無効です。

cluster("EventhouseClusterURI").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")
cluster("OtherEventhouseClusterURI").database("OtherDb").SomeTable("EventTable")

次のクエリは、データに基づいて変数スキーマ出力を持つリモート関数GetDataPivotを呼び出します(pivot()プラグインには動的出力があります)。 この呼び出しはルール#3に違反します。そのため、無効です。

OtherDbの表形式関数。

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

既定のデータベースの表形式関数。

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