Kueri lintas kluster dan lintas database

Kueri berjalan dengan database tertentu yang ditetapkan sebagai database dalam konteks. Database ini bertindak sebagai default untuk pemeriksaan izin. Jika entitas dirujuk dalam kueri tanpa menentukan kluster atau database, entitas tersebut diselesaikan terhadap database ini.

Artikel ini menjelaskan cara menjalankan kueri yang melibatkan entitas yang terletak di luar database konteks saat ini.

Prasyarat

Mengidentifikasi kluster dan database dalam konteks

Tabel berikut ini menjelaskan cara mengidentifikasi database dalam konteks menurut lingkungan kueri.

Lingkungan Database dalam konteks
Penjelajah Kusto Database default adalah database yang dipilih di panel koneksi, dan kluster saat ini adalah kluster yang berisi database tersebut.
Antarmuka pengguna web Azure Data Explorer Database default adalah database yang dipilih di panel koneksi, dan kluster saat ini adalah kluster yang berisi database tersebut.
Pustaka klien Database dan kluster default ditentukan oleh Data Source properti dan Initial Catalog dari string koneksi Kusto.

Melakukan kueri lintas kluster atau lintas database

Untuk mengakses entitas di luar database dalam konteks, gunakan fungsi cluster() dan database() untuk memenuhi syarat nama entitas.

Untuk tabel dalam database yang berbeda dalam kluster yang sama:

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

Untuk tabel dalam kluster jarak jauh:

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

Catatan

Untuk menjalankan kueri, Anda harus memiliki izin penampil ke database default dan ke setiap database lain yang dirujuk dalam kueri. Untuk informasi selengkapnya, lihat Kontrol akses berbasis peran Kusto.

Tip

Jumlah rekaman yang dikembalikan dari kueri dibatasi secara default, meskipun tidak ada penggunaan take operator tertentu. Untuk mencabut batas ini, gunakan opsi permintaan klien notruncation. Untuk informasi selengkapnya, lihat Batas kueri.

Nama yang memenuhi syarat dan operator serikat

Ketika nama yang memenuhi syarat muncul sebagai operand operator union, maka wildcard dapat digunakan untuk menentukan beberapa tabel dan beberapa database. Wildcard tidak diizinkan dalam nama kluster.

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

Catatan

Nama database default juga merupakan potensi kecocokan, jadi database("*") menentukan semua tabel dari semua database termasuk default.

Nama yang memenuhi syarat dan membatasi pernyataan akses

Nama atau pola yang memenuhi syarat juga dapat disertakan dalam pernyataan akses terbatas . Kartubebas dalam nama kluster tidak diizinkan.

Kueri berikut membatasi akses kueri ke entitas berikut:

  • Nama entitas apa pun yang dimulai dengan ... saya di database default.
  • Tabel apa pun di semua database bernama MyOther... dari kluster saat ini.
  • Tabel apa pun di semua database bernama my2... di kluster OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);

Menangani perubahan skema entitas jarak jauh

Untuk memproses kueri lintas kluster, kluster yang melakukan interpretasi kueri awal harus memiliki skema entitas yang dirujuk pada kluster jarak jauh. Untuk mendapatkan informasi ini, perintah dikirim untuk mengambil skema, yang kemudian disimpan dalam cache.

Jika terjadi perubahan skema di kluster jarak jauh, skema yang di-cache mungkin menjadi kedaluarsa. Ini dapat menyebabkan efek yang tidak diinginkan, termasuk skenario di mana kolom baru atau yang dihapus menyebabkan Partial query failure. Untuk mengatasi masalah tersebut, refresh skema secara manual dengan perintah .clear cache remote-schema .

Fungsi dan tampilan

Fungsi dan tampilan (persisten dan dibuat sebaris) dapat mereferensikan tabel di seluruh batas database dan kluster. Kode berikut ini valid.

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

Fungsi dan tampilan persisten dapat diakses dari database lain dalam kluster yang sama.

Misalnya, Anda membuat fungsi tabular berikut (tampilan) dalam database OtherDb:

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

Kemudian, Anda membuat fungsi skalar berikut dalam database OtherDb:

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

Dalam database default, entitas ini dapat dirujuk sebagai berikut:

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

Keterbatasan panggilan fungsi lintas kluster

Fungsi atau tampilan tabular dapat dirujuk di seluruh kluster. Batasan berikut berlaku:

  • Fungsi jarak jauh harus mengembalikan skema tabular. Fungsi skalar hanya dapat diakses di kluster yang sama.
  • Fungsi jarak jauh hanya dapat menerima argumen skalar. Fungsi yang mendapatkan satu atau beberapa argumen tabel hanya dapat diakses di kluster yang sama.
  • Skema hasil fungsi jarak jauh harus diperbaiki (diketahui terlebih dahulu tanpa mengeksekusi bagian kueri). Ini menghalangi penggunaan konstruksi kueri seperti plugin pivot. (Perhatikan bahwa beberapa plugin, seperti plugin bag_unpack, mendukung cara untuk menunjukkan skema hasil secara statis, dan dalam bentuk ini dapat digunakan dalam panggilan fungsi lintas kluster.)
  • Untuk alasan performa, skema entitas jarak jauh disimpan dalam cache oleh kluster panggilan setelah panggilan awal. Oleh karena itu, perubahan yang dilakukan pada entitas jarak jauh dapat mengakibatkan ketidakcocokan dengan informasi skema yang disimpan dalam cache, yang berpotensi menyebabkan kegagalan kueri. Untuk informasi selengkapnya, lihat Kueri lintas kluster dan perubahan skema.

Contoh

Panggilan lintas kluster berikut valid.

cluster("OtherCluster").database("SomeDb").MyView("exception") | count

Kueri berikut memanggil fungsi skalar jarak jauh MyCalc. Panggilan ini melanggar aturan #1, jadi tidak valid.

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

Kueri berikut memanggil fungsi jarak jauh MyCalc dan menyediakan parameter tabular. Panggilan ini melanggar aturan #2, jadi tidak valid.

cluster("OtherCluster").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )

Kueri berikut memanggil fungsi jarak jauh SomeTable yang memiliki output skema variabel berdasarkan parameter tablename. Panggilan ini melanggar aturan #3, jadi tidak valid.

Fungsi tabular dalam OtherDb.

.create function SomeTable(tablename:string) { table(tablename)  }  

Di database default.

cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")

Kueri berikut memanggil fungsi jarak jauh GetDataPivot yang memiliki output skema variabel berdasarkan plugin data (pivot() plugin memiliki output dinamis). Panggilan ini melanggar aturan #3, jadi tidak valid.

Fungsi tabular dalam OtherDb.

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

Fungsi tabular dalam database default.

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