複数のデータベースに対するクエリと複数のクラスターに対するクエリ

クエリは、1 つの特定のデータベースの "コンテキスト内" で実行されます。 このデータベースは既定でアクセス許可を確認するために使用され、明示的なクラスターまたはデータベースの修飾がないクエリ内のすべてのエンティティ参照は、この既定のデータベースに対して解決されます。

  • Kusto Explorerでは、既定のデータベースは[接続]パネルで選択されたデータベースであり、現在のクラスターは、そのデータベースを含む接続です。
  • クライアント ライブラリを使用する場合、現在のクラスターと既定のデータベースはそれぞれ、接続文字列Data Source プロパティと Initial Catalog プロパティによって指定されます。

クエリ

既定以外のデータベースからテーブルにアクセスするには、修飾名構文を使用する必要があります。

現在のクラスター内のデータベースにアクセスする場合。

database("<database name>").<table name>

リモートクラスター内のデータベース。

cluster("<cluster name>").database("<database name>").<table name>

データベース名の大文字と小文字は区別されます。

クラスター名 は大文字と小文字を区別しません。次のいずれかの形式を使用できます。

  • http://contoso.kusto.windows.net:1234/などの整形されたURL。 'HTTP'および'HTTPS'スキームのみサポートされています。
  • その完全修飾ドメイン名(FQDN)はcontoso.kusto.windows.netなどです。 この文字列は、https://contoso.kusto.windows.net/を使用することと同じです。
  • contosocontoso.westusなど、短い名前(ドメイン部分のないホスト名[およびリージョン])。 これらの文字列は、https://contoso.kusto.windows.net/https://contoso.westus.kusto.windows.net/として解釈されます。

Note

データベース間アクセスは、通常のアクセス許可チェックの対象になります。 クエリを実行するには、既定のデータベースに対する読み取りアクセス許可と、クエリで参照されている他のすべてのデータベース(現在のクラスターとリモート クラスター内)に対する読み取りアクセス許可が必要です。

修飾名は、テーブル名を使用できる任意のコンテキストで使用できます。

次のすべてが有効です。

database("OtherDb").Table | where ...

union Table1, cluster("OtherCluster").database("OtherDb").Table2 | project ...

database("OtherDb1").Table1 | join cluster("OtherCluster").database("OtherDb2").Table2 on Key | join Table3 on Key | extend ...

重要

クラスターが異なるテナントにある場合は、trustedExternalTenants プロパティの編集が必要になる場合があります。 信頼されていない外部テナントでは、未承認エラー (401) エラーが発生する可能性があります。 詳細については、「別のテナントのプリンシパルにクラスターへのアクセスを許可する方法」を参照してください。

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

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

Note

  • 既定のデータベースの名前も一致する可能性があります。そのため、database("*")は、既定値を含むすべてのデータベースのすべてのテーブルを指定します。
  • スキーマの変更がクラスター間クエリに与える影響の詳細については、「クラスター間クエリとスキーマの変更」を参照してください。

アクセス制限

限定名またはパターンもアクセス制限ステートメントに含め、クラスター名のワイルドカードは許可されません。

restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);

上記では、クエリへのアクセスが次のエンティティに制限されます。

  • 既定のデータベースのmy...で始まる任意のエンティティ名。
  • 現在のクラスターのMyOther...という名前のすべてのデータベース内の任意のテーブル。
  • OtherCluster.kusto.windows.netというクラスター内のmy2... という名前のすべてのデータベース内の任意のテーブル。

関数とビュー

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

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()

データの表示

クライアントにデータを返すステートメントは、take演算子の特定の使用がない場合でも、返されるレコードの数によって暗黙的に制限されます。 この制限を引き上げるには、 notruncation クライアント要求オプションを使います。

グラフィカルな形式でデータを表示するには、render 演算子を使用します。

データベース間クエリとクラスター間クエリは、Azure Monitorでサポートされていません。 複数のワークスペースとアプリにわたるクエリについてはAzure Monitorのクロスワークスペースクエリに関するページを参照してください。