複数のデータベースに対するクエリと複数のクラスターに対するクエリ
クエリは、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
/
を使用することと同じです。 contoso
やcontoso.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のクロスワークスペースクエリに関するページを参照してください。