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
- Pokud jsou clustery v různých tenantech, postupujte podle pokynů v tématu Povolení dotazů a příkazů mezi tenanty.
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 Catalog př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 OtherDb
vytvoříte následující tabulkovou funkci (zobrazení):
.create function MyView(v:string) { Table1 | where Column1 has v ... }
Potom v databázi OtherDb
vytvoří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, jakobag_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()
Související obsah
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro