Zapytania obejmujące wiele klastrów i między bazami danych

Zapytania są uruchamiane z określoną bazą danych wyznaczoną jako baza danych w kontekście. Ta baza danych działa jako domyślna dla sprawdzania uprawnień. Jeśli jednostka jest przywołyna w zapytaniu bez określania klastra lub bazy danych, jest rozpoznawana względem tej bazy danych.

W tym artykule wyjaśniono, jak wykonywać zapytania obejmujące jednostki znajdujące się poza bieżącą bazą danych kontekstu.

Wymagania wstępne

Identyfikowanie klastra i bazy danych w kontekście

W poniższej tabeli wyjaśniono, jak zidentyfikować bazę danych w kontekście według środowiska zapytań.

Środowisko Baza danych w kontekście
Kusto Explorer Domyślna baza danych jest wybrana w panelu połączeń, a bieżący klaster jest klastrem zawierającym bazę danych.
Internetowy interfejs użytkownika usługi Azure Data Explorer Domyślna baza danych jest wybrana w okienku połączenia, a bieżący klaster jest klastrem zawierającym bazę danych.
Biblioteki klienta Domyślna baza danych i klaster są określane przez Data Source właściwości i Initial Catalogparametrów połączenia usługi Kusto.

Wykonywanie zapytań między klastrami lub między bazami danych

Aby uzyskać dostęp do jednostek spoza bazy danych w kontekście, użyj funkcji cluster() i database(), aby zakwalifikować nazwę jednostki.

W przypadku tabeli w innej bazie danych w tym samym klastrze:

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

W przypadku tabeli w klastrze zdalnym:

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

Uwaga

Aby wykonać zapytanie, musisz mieć uprawnienia przeglądarki do domyślnej bazy danych i do każdej innej bazy danych, do której odwołuje się zapytanie. Aby uzyskać więcej informacji, zobacz Kontrola dostępu oparta na rolach usługi Kusto.

Porada

Liczba rekordów zwracanych z zapytania jest domyślnie ograniczona, nawet jeśli nie ma określonego take użycia operatora. Aby podnieść ten limit, użyj notruncation opcji żądania klienta. Aby uzyskać więcej informacji, zobacz Limity zapytań.

Kwalifikowane nazwy i operator unii

Gdy kwalifikowana nazwa jest wyświetlana jako operand operatora unii, symbole wieloznaczne mogą służyć do określania wielu tabel i wielu baz danych. Symbole wieloznaczne nie są dozwolone w nazwach klastrów.

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

Uwaga

Nazwa domyślnej bazy danych jest również potencjalnym dopasowaniem, dlatego database("*") określa wszystkie tabele wszystkich baz danych, w tym domyślne.

Kwalifikowane nazwy i ograniczanie instrukcji dostępu

Kwalifikowane nazwy lub wzorce można również uwzględnić w instrukcji ograniczeń dostępu . Symbole wieloznaczne w nazwach klastrów nie są dozwolone.

Następujące zapytanie ogranicza dostęp do zapytań do następujących jednostek:

  • Dowolna nazwa jednostki rozpoczynająca się od my... w domyślnej bazie danych.
  • Każda tabela we wszystkich bazach danych o nazwie MyOther... bieżącego klastra.
  • Każda tabela we wszystkich bazach danych o nazwie my2... w klastrze OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);

Obsługa zmian schematu jednostek zdalnych

Aby przetworzyć zapytanie obejmujące wiele klastrów, klaster, który wykonuje początkową interpretację zapytania, musi mieć schemat jednostek, do których odwołuje się odwołanie w klastrach zdalnych. Aby uzyskać te informacje, polecenie jest wysyłane w celu pobrania schematów, które są następnie przechowywane w pamięci podręcznej.

W przypadku zmiany schematu w klastrze zdalnym schemat buforowany może stać się nieaktualny. Może to prowadzić do niepożądanych efektów, w tym scenariuszy, w których nowe lub usunięte kolumny powodują .Partial query failure Aby rozwiązać takie problemy, ręcznie odśwież schemat za pomocą polecenia .clear cache remote-schema .

Funkcje i widoki

Funkcje i widoki (trwałe i utworzone w tekście) mogą odwoływać się do tabel w granicach bazy danych i klastra. Poniższy kod jest prawidłowy.

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

Dostęp do funkcji trwałych i widoków można uzyskać z innej bazy danych w tym samym klastrze.

Załóżmy na przykład, że utworzysz następującą funkcję tabelaryczny (widok) w bazie danych OtherDb:

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

Następnie utworzysz następującą funkcję skalarną w bazie danych OtherDb:

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

W domyślnej bazie danych te jednostki można odwoływać się w następujący sposób:

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

Ograniczenia wywołań funkcji między klastrami

Funkcje tabelaryczne lub widoki można odwoływać się do klastrów. Obowiązują następujące ograniczenia:

  • Funkcje zdalne muszą zwracać schemat tabelaryczny. Dostęp do funkcji skalarnych można uzyskać tylko w tym samym klastrze.
  • Funkcje zdalne mogą akceptować tylko argumenty skalarne. Funkcje, które uzyskują co najmniej jeden argument tabeli, mogą być dostępne tylko w tym samym klastrze.
  • Schemat wyników funkcji zdalnych musi zostać naprawiony (znany z wyprzedzeniem bez wykonywania części zapytania). Uniemożliwia to korzystanie z konstrukcji zapytań, takich jak wtyczka pivot . (Należy pamiętać, że niektóre wtyczki, takie jak bag_unpack wtyczka, obsługują sposób wskazywania schematu wyniku statycznie, a w tym formularzu mogą być używane w wywołaniach funkcji między klastrami).
  • Ze względów wydajności schemat jednostek zdalnych jest buforowany przez klaster wywołujący po wywołaniu początkowym. W związku z tym zmiany wprowadzone w jednostce zdalnej mogą powodować niezgodność z buforowanymi informacjami o schemacie, co może prowadzić do niepowodzeń zapytań. Aby uzyskać więcej informacji, zobacz Zapytania między klastrami i zmiany schematu.

Przykłady

Następujące wywołanie między klastrami jest prawidłowe.

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

Następujące zapytanie wywołuje zdalną funkcję MyCalcskalarną . To wywołanie narusza regułę nr 1, więc jest nieprawidłowe.

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

Poniższe zapytanie wywołuje funkcję MyCalc zdalną i udostępnia parametr tabelaryczny. To wywołanie narusza regułę nr 2, więc jest nieprawidłowe.

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

Poniższe zapytanie wywołuje funkcję SomeTable zdalną, która ma dane wyjściowe schematu zmiennej na podstawie parametru tablename. To wywołanie narusza regułę 3, więc jest nieprawidłowe.

Funkcja tabelaryczna w obiekcie OtherDb.

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

W domyślnej bazie danych.

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

Poniższe zapytanie wywołuje funkcję GetDataPivot zdalną, która ma dane wyjściowe schematu zmiennej na podstawie danych (wtyczka pivot() ma dynamiczne dane wyjściowe. To wywołanie narusza regułę 3, więc jest nieprawidłowe.

Funkcja tabelaryczna w obiekcie OtherDb.

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

Funkcja tabelaryczna w domyślnej bazie danych.

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