Udostępnij za pośrednictwem


Zapytania między klastrami i między bazami danych

Dotyczy: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

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

Zapytania są uruchamiane z określoną bazą danych wyznaczoną jako baza danych w kontekście. Ta baza danych działa jako domyślna funkcja sprawdzania uprawnień. Jeśli jednostka jest przywołyowana w zapytaniu bez określania kontekstu, zostanie ona rozpoznana 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

Identyfikowanie magazynu zdarzeń 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 klienckie Określ domyślną bazę danych i klaster według Data Source właściwości i Initial Catalog parametry połączenia Kusto.
Środowisko Baza danych/magazyn zdarzeń w kontekście
Kusto Explorer Domyślna baza danych jest wybrana na panelu połączeń, a bieżący magazyn zdarzeń jest magazynem zdarzeń zawierającym bazę danych.
Zestaw zapytań KQL analizy w czasie rzeczywistym Domyślna baza danych to bieżąca baza danych wybrana bezpośrednio lub za pośrednictwem magazynu zdarzeń.
Biblioteki klienckie Określ domyślną bazę danych z identyfikatorem URI bazy danych używanym Data Source dla właściwości parametry połączenia Kusto. W przypadku magazynu zdarzeń użyj jego identyfikatora URI klastra. Możesz ją znaleźć, wybierając pozycję Przegląd systemu w sekcji Szczegóły magazynu zdarzeń dla wybranego magazynu zdarzeń.

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

Wykonywanie zapytań między magazynami zdarzeń 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>

W przypadku tabeli w innej bazie danych w ramach tego samego magazynu zdarzeń:

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

W przypadku tabeli w zdalnym magazynie zdarzeń lub w klastrze zdalnym (na przykład w usłudze Azure Data Explorer):

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

Uwaga

Aby wykonać zapytanie, musisz mieć uprawnienie 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 Kusto role-based access control (Kontrola dostępu oparta na rolach w usłudze Kusto).

Napiwek

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("*").*

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 magazynów zdarzeń.

union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherEventhouseClusterURI").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 ograniczenia dostępu . Symbole wieloznaczne w nazwach klastrów nie są dozwolone.

Symbole wieloznaczne w nazwach zdarzeń 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.
  • Dowolna tabela we wszystkich bazach danych o nazwie MyOther... bieżącego klastra.
  • Dowolna tabela we wszystkich bazach danych o nazwie my2... w klastrze OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
  • Dowolna nazwa jednostki rozpoczynająca się od zdarzenia... w domyślnej bazie danych.
  • Dowolna tabela we wszystkich bazach danych o nazwie EventOther... bieżącego magazynu zdarzeń.
  • Dowolna tabela we wszystkich bazach danych o nazwie event2... w OtherEventhouse.kusto.data.microsoft.com eventhouse.
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);

Obsługa zmian schematu jednostek zdalnych

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

Jeśli w klastrze zdalnym nastąpiła zmiana schematu, buforowany schemat 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 .

Aby przetworzyć zapytanie klastra typu "cross-eventhouse- to-ADX" lub "eventhouse-to-ADX", w ramach którego wykonywana jest wstępna interpretacja zapytania, musi mieć schemat jednostek, do których odwołuje się zdalny magazyn zdarzeń lub klastry. Aby uzyskać te informacje, polecenie jest wysyłane w celu pobrania schematów, które są następnie przechowywane w pamięci podręcznej.

Jeśli istnieje zdalna zmiana schematu, buforowany schemat 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

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

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

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

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

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

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

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

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

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

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

.create function EventCalc(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").EventView("exception") | extend CalCol=database("OtherDb").EventCalc(Col1, Col2, Col3) | take 10

Ograniczenia wywołań funkcji między klastrami

Do funkcji tabelarycznych lub widoków można odwoływać się między klastrami. 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 być stały (znany z wyprzedzeniem bez wykonywania części zapytania). Dlatego nie można używać konstrukcji zapytań, takich jak wtyczka pivot . Niektóre wtyczki, takie jak bag_unpack wtyczka, obsługują sposób wskazywania schematu wyników statycznie i w tym formularzu może być używany w wywołaniach funkcji między klastrami.
  • Ze względu na wydajność wywołujący klaster buforuje schemat jednostek zdalnych po początkowym wywołaniu. W związku z tym zmiany wprowadzone w jednostce zdalnej mogą spowodować niezgodność z informacjami o buforowanym schemacie, co potencjalnie prowadzi do niepowodzeń zapytań. Aby uzyskać więcej informacji, zobacz Zapytania między klastrami i zmiany schematu.

Ograniczenia wywołań funkcji między zdarzeniami

Do funkcji tabelarycznych lub widoków można odwoływać się między magazynami zdarzeń. Obowiązują następujące ograniczenia:

  • Funkcje zdalne muszą zwracać schemat tabelaryczny. Dostęp do funkcji skalarnych można uzyskać tylko w tym samym centrum zdarzeń.
  • Funkcje zdalne mogą akceptować tylko argumenty skalarne. Funkcje, które uzyskują co najmniej jeden argument tabeli, mogą być dostępne tylko w tym samym obiekcie eventhouse.
  • Schemat wyników funkcji zdalnych musi być stały (znany z wyprzedzeniem bez wykonywania części zapytania). Dlatego nie można używać konstrukcji zapytań, takich jak wtyczka pivot . Niektóre wtyczki, takie jak bag_unpack wtyczka, obsługują sposób wskazywania schematu wyników statycznie i w tym formularzu może być używany w wywołaniach funkcji między eventhouse.
  • Ze względu na wydajność wywołujący magazyn zdarzeń buforuje schemat jednostek zdalnych po początkowym wywołaniu. W związku z tym zmiany wprowadzone w jednostce zdalnej mogą spowodować niezgodność z informacjami o buforowanym schemacie, co potencjalnie 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łę 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łę 2, więc jest nieprawidłowe.

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

Następujące połączenie między magazynami zdarzeń jest prawidłowe.

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

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

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

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

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

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

Funkcja tabelaryczna w pliku OtherDb.

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

W domyślnej bazie danych.

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

Następujące 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łę nr 3, więc jest nieprawidłowe.

Funkcja tabelaryczna w pliku OtherDb.

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

Funkcja tabelaryczna w domyślnej bazie danych.

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