Dotazy mezi clustery a mezi databázemi

Dotazy se spouští s konkrétní databází označenou jako databáze v kontextu. Tato databáze funguje jako výchozí pro kontrolu oprávnění. Pokud se na entitu odkazuje v dotazu bez zadání clusteru nebo databáze, přeloží se na tuto databázi.

Tento článek vysvětluje, jak spouštět dotazy, které zahrnují entity umístěné mimo aktuální kontextovou databázi.

Požadavky

Identifikace clusteru a databáze v kontextu

Následující tabulka vysvětluje, jak identifikovat databázi v kontextu podle prostředí dotazu.

Prostředí Databáze v kontextu
Průzkumník Kusto Výchozí databáze je databáze vybraná na panelu připojení a aktuální cluster je cluster obsahující danou databázi.
Webové uživatelské rozhraní Azure Data Explorer Výchozí databáze je databáze vybraná v podokně připojení a aktuální cluster je cluster obsahující danou databázi.
Klientské knihovny Výchozí databáze a cluster jsou určeny vlastnostmi Data Source a Initial Catalogpřipojovacích řetězců Kusto.

Provádění dotazů mezi clustery nebo mezi databázemi

Pokud chcete získat přístup k entitě mimo databázi v kontextu, použijte funkce cluster() a database() k kvalifikaci názvu entity.

Pro tabulku v jiné databázi v rámci stejného clusteru:

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

Tabulka ve vzdáleném clusteru:

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

Poznámka

Pokud chcete spustit dotaz, musíte mít oprávnění k prohlížeči výchozí databáze a ke každé další databázi, na kterou dotaz odkazuje. Další informace najdete v tématu Řízení přístupu na základě role Kusto.

Tip

Počet záznamů vrácených dotazem je ve výchozím nastavení omezený, a to i v případě, že operátor neexistuje konkrétní použití take . Pokud chcete tento limit zrušit, použijte notruncation možnost žádosti klienta. Další informace najdete v tématu Limity dotazů.

Kvalifikované názvy a operátor sjednocení

Pokud se kvalifikovaný název zobrazí jako operand sjednocovacího operátoru, lze pomocí zástupných znaků určit více tabulek a více databází. Zástupné cardy nejsou povolené v názvech clusterů.

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

Poznámka

Název výchozí databáze je také potenciální shoda, takže database("*") určuje všechny tabulky všech databází včetně výchozí.

Kvalifikované názvy a příkazy pro omezení přístupu

Kvalifikované názvy nebo vzory lze také zahrnout do příkazu omezení přístupu . Zástupné cardy v názvech clusterů nejsou povolené.

Následující dotaz omezuje přístup k dotazům na následující entity:

  • Libovolný název entity začínající na my... ve výchozí databázi
  • Libovolná tabulka ve všech databázích s názvem MyOther... aktuálního clusteru.
  • Libovolná tabulka ve všech databázích s názvem my2... v clusteru OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);

Zpracování změn schématu vzdálených entit

Ke zpracování dotazu mezi clustery musí mít cluster, který provádí počáteční interpretaci dotazu, schéma entit odkazovaných na vzdálené clustery. K získání těchto informací se odešle příkaz, který načte schémata, která jsou pak uložena v mezipaměti.

V případě změny schématu ve vzdáleném clusteru může být schéma uložené v mezipaměti zastaralé. To může vést k nežádoucím účinkům, včetně scénářů, kdy nové nebo odstraněné sloupce způsobí Partial query failure. Pokud chcete tyto problémy vyřešit, aktualizujte schéma ručně pomocí příkazu .clear cache remote-schema .

Funkce a zobrazení

Funkce a zobrazení (trvalá a vytvořená vložená) můžou odkazovat na tabulky napříč hranicemi databáze a clusteru. Následující kód je platný.

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

K trvalým funkcím a zobrazením je možné přistupovat z jiné databáze ve stejném clusteru.

Řekněme například, že v databázi OtherDbvytvoříte následující tabulkovou funkci (zobrazení):

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

Potom v databázi OtherDbvytvoříte následující skalární funkci:

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

Ve výchozí databázi lze na tyto entity odkazovat následujícím způsobem:

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

Omezení volání funkcí mezi clustery

Na tabulkové funkce nebo zobrazení je možné odkazovat napříč clustery. Platí následující omezení:

  • Vzdálené funkce musí vracet tabulkové schéma. Ke skalárním funkcím je možné přistupovat pouze ve stejném clusteru.
  • Vzdálené funkce můžou přijímat pouze skalární argumenty. Funkce, které získají jeden nebo více argumentů tabulky, jsou přístupné jenom ve stejném clusteru.
  • Musí být opraveno schéma výsledků vzdálených funkcí (známé předem bez provádění částí dotazu). To brání použití konstruktorů dotazů, jako pivot je modul plug-in. (Všimněte si, že některé moduly plug-in, jako bag_unpack je modul plug-in, podporují způsob statického označení schématu výsledku a v této podobě ho lze použít při volání funkcí mezi clustery.)
  • Z důvodů výkonu se schéma vzdálených entit ukládá do mezipaměti volajícího clusteru po počátečním volání. Změny provedené ve vzdálené entitě proto můžou vést k neshodě s informacemi schématu uloženého v mezipaměti, což může vést k selhání dotazů. Další informace najdete v tématu Změny schématu a dotazů mezi clustery.

Příklady

Následující volání mezi clustery je platné.

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

Následující dotaz volá vzdálenou skalární funkci MyCalc. Toto volání porušuje pravidlo č. 1, takže není platné.

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

Následující dotaz volá vzdálenou funkci MyCalc a poskytuje tabulkový parametr. Toto volání porušuje pravidlo č. 2, takže není platné.

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

Následující dotaz volá vzdálenou funkci SomeTable , která má výstup schématu proměnné na základě parametru tablename. Toto volání porušuje pravidlo č. 3, takže není platné.

Tabulková funkce v nástroji OtherDb.

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

Ve výchozí databázi.

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

Následující dotaz volá vzdálenou funkci GetDataPivot , která má výstup schématu proměnné na základě dat (modul plug-in pivot() má dynamický výstup). Toto volání porušuje pravidlo č. 3, takže není platné.

Tabulková funkce v nástroji OtherDb.

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

Tabulková funkce ve výchozí databázi.

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