Запросы между кластерами и несколькими базами данных
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Запросы выполняются с определенной базой данных, назначенной в качестве базы данных в контексте. Эта база данных выступает в качестве значения по умолчанию для проверки разрешений. Если сущность ссылается в запросе без указания кластера или базы данных, она разрешается для этой базы данных.
Запросы выполняются с определенной базой данных, назначенной в качестве базы данных в контексте. Эта база данных выступает в качестве значения по умолчанию для проверки разрешений. Если сущность ссылается в запросе без указания контекста, она разрешается для этой базы данных.
В этой статье объясняется, как выполнять запросы, включающие сущности, расположенные вне текущей базы данных контекста.
Необходимые компоненты
- Если кластеры находятся в разных клиентах, следуйте инструкциям в разделе "Разрешить межтенантные запросы и команды".
Определение кластера и базы данных в контексте
Определение хранилища событий и базы данных в контексте
В следующей таблице объясняется, как определить базу данных в контексте по среде запроса.
Среда | База данных в контексте |
---|---|
Kusto Explorer | База данных по умолчанию выбрана на панели подключений, а текущий кластер — это кластер, содержащий ее. |
Пользовательский веб-интерфейс Azure Data Explorer | База данных по умолчанию выбрана в области подключения, а текущий кластер — это кластер, содержащий эту базу данных. |
Клиентские библиотеки | Укажите базу данных и кластер по умолчанию по Data Source Initial Catalog свойствам строка подключения Kusto. |
Среда | База данных или хранилище событий в контексте |
---|---|
Kusto Explorer | База данных по умолчанию выбрана на панели подключений, а текущий дом событий — это хранилище событий, содержащее ту базу данных. |
Набор запросов KQL аналитики в режиме реального времени | База данных по умолчанию — это текущая база данных, выбранная непосредственно или через хранилище событий. |
Клиентские библиотеки | Укажите базу данных по умолчанию с URI базы данных, используемую для Data Source свойств строка подключения Kusto. Для дома событий используйте его универсальный код ресурса (URI) кластера. Его можно найти, выбрав "Обзор системы" в разделе сведений о событии для выбранного дома событий. |
Выполнение запросов между кластерами или между базами данных
Выполнение запросов между событиями или межбазовых запросов
Чтобы получить доступ к сущностям вне базы данных в контексте, используйте функции cluster() и database() для указания имени сущности.
Для таблицы в другой базе данных в одном кластере:
database("<DatabaseName>").<TableName>
Для таблицы в удаленном кластере:
cluster("<ClusterName>").database("<DatabaseName>").<TableName>
Для таблицы в другой базе данных в одном хранилище событий:
database("<DatabaseName>").<TableName>
Для таблицы в удаленном хранилище событий или удаленном кластере (например, Azure Data Explorer):
cluster("<EventhouseClusterURI>").database("<DatabaseName>").<TableName>
Примечание.
Чтобы выполнить запрос, необходимо иметь разрешение на просмотр базы данных по умолчанию и любую другую базу данных, на которые ссылается запрос. Дополнительные сведения см. в разделе "Управление доступом на основе ролей Kusto".
Совет
Количество записей, возвращаемых из запроса, ограничено по умолчанию, даже если нет конкретного take
использования оператора. Чтобы снять это ограничение, используйте параметр notruncation
клиентского запроса. Дополнительные сведения см. в статье об ограничениях запроса.
Квалифицированные имена и оператор объединения
Если полное имя отображается в качестве операнда оператора объединения, то подстановочные знаки можно использовать для указания нескольких таблиц и нескольких баз данных. Подстановочные знаки не разрешены в именах кластеров.
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherCluster").database("*").*
Если полное имя отображается в качестве операнда оператора объединения, то подстановочные знаки можно использовать для указания нескольких таблиц и нескольких баз данных. Подстановочные знаки не разрешены в именах центров событий.
union withsource=TableName *, database("OtherDb*").*Table, cluster("OtherEventhouseClusterURI").database("*").*
Примечание.
Имя базы данных по умолчанию также является потенциальным совпадением, поэтому database("*")
указывает все таблицы всех баз данных, включая значения по умолчанию.
Квалифицированные имена и ограничения инструкций доступа
Полные имена или шаблоны также могут быть включены в инструкцию ограничения доступа . Подстановочные знаки в именах кластеров не разрешены.
Подстановочные знаки в именах домов событий не разрешены.
Следующий запрос ограничивает доступ к запросам следующим сущностям:
- Любое имя сущности, начиная с my... в базе данных по умолчанию.
- Любая таблица во всех базах данных с именем MyOther... текущего кластера.
- Любая таблица во всех базах данных с именем my2... в кластере OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);
- Любое имя сущности, начиная с события... в базе данных по умолчанию.
- Любая таблица во всех базах данных с именем EventOther... текущего хранилища событий.
- Любая таблица во всех базах данных с именем event2... в OtherEventhouse.kusto.data.microsoft.com eventhouse.
restrict access to (event*, database("EventOther*").*, cluster("OtherEventhouseClusterURI").database("event2*").*);
Обработка изменений схемы удаленных сущностей
Чтобы обработать запрос между кластерами, кластер, выполняющий начальную интерпретацию запросов, должен иметь схему сущностей, на которые ссылаются удаленные кластеры. Чтобы получить эти сведения, команда отправляется для получения схем, которые затем хранятся в кэше.
Если в удаленном кластере изменена схема, кэшированная схема может стать устаревшей. Это может привести к нежелательным эффектам, в том числе сценариям, в которых новые или удаленные столбцы приводят к возникновению Partial query failure
ошибки. Чтобы устранить такие проблемы, вручную обновите схему с помощью команды remote-schema кэша .clear.
Чтобы обработать междоменный или кластерный запрос eventhouse to-ADX, в хранилище событий, выполняющем начальную интерпретацию запросов, необходимо иметь схему сущностей, на которые ссылаются удаленные центры событий или кластеры. Чтобы получить эти сведения, команда отправляется для получения схем, которые затем хранятся в кэше.
При изменении удаленной схемы кэшированные схемы могут стать устаревшими. Это может привести к нежелательным эффектам, в том числе сценариям, в которых новые или удаленные столбцы приводят к возникновению Partial query failure
ошибки. Чтобы устранить такие проблемы, вручную обновите схему с помощью команды remote-schema кэша .clear.
Функции и представления
Функции и представления (постоянные и созданные встроенные) могут ссылаться на таблицы по границам базы данных и кластера. Следующий код действителен.
let MyView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherCluster").database("SomeDb").Table3 on Key;
MyView | where ...
Постоянные функции и представления можно получить из другой базы данных в одном кластере.
Например, предположим, что в базе данных OtherDb
создается следующая табличная функция (представление):
.create function MyView(v:string) { Table1 | where Column1 has v ... }
Затем вы создадите следующую скалярную функцию в базе данных OtherDb
:
.create function MyCalc(a:double, b:double, c:double) { (a + b) / c }
В базе данных по умолчанию эти сущности можно ссылаться следующим образом:
database("OtherDb").MyView("exception") | extend CalCol=database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
Функции и представления (постоянные и созданные встроенные) могут ссылаться на таблицы между базами данных и границами события. Следующий код действителен.
let EventView = Table1 join database("OtherDb").Table2 on Key | join cluster("OtherEventhouseClusterURI").database("SomeDb").Table3 on Key;
EventView | where ...
Постоянные функции и представления можно получить из другой базы данных в том же хранилище событий.
Например, предположим, что в базе данных OtherDb
создается следующая табличная функция (представление):
.create function EventView(v:string) { Table1 | where Column1 has v ... }
Затем вы создадите следующую скалярную функцию в базе данных OtherDb
:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
Например, предположим, что в базе данных OtherDb
создается следующая табличная функция (представление):
.create function EventView(v:string) { Table1 | where Column1 has v ... }
Затем вы создадите следующую скалярную функцию в базе данных OtherDb
:
.create function EventCalc(a:double, b:double, c:double) { (a + b) / c }
В базе данных по умолчанию эти сущности можно ссылаться следующим образом:
database("OtherDb").EventView("exception") | extend CalCol=database("OtherDb").EventCalc(Col1, Col2, Col3) | take 10
Ограничения вызовов функций между кластерами
Табличные функции или представления можно ссылаться на различные кластеры. Действительны следующие ограничения.
- Удаленные функции должны возвращать табличную схему. К скалярным функциям можно обращаться только в одном кластере.
- Удаленные функции могут принимать только скалярные аргументы. К функциям, получающим один или несколько аргументов таблицы, можно получить доступ только в одном кластере.
- Схема результатов удаленных функций должна быть исправлена (известна заранее без выполнения частей запроса). Поэтому конструкции запросов, такие как подключаемый
pivot
модуль, нельзя использовать. Некоторые подключаемые модули, такие как подключаемыйbag_unpack
модуль, поддерживают способ статического обозначения схемы результатов, а в этой форме его можно использовать в вызовах функций между кластерами. - По соображениям производительности вызывающий кластер кэширует схему удаленных сущностей после первоначального вызова. Поэтому изменения, внесенные в удаленную сущность, могут привести к несоответствию с кэшируемыми сведениями схемы, что может привести к сбоям запросов. Дополнительные сведения см. в разделе "Запросы между кластерами" и изменения схемы.
Ограничения вызовов функций между событиями
Табличные функции или представления можно ссылаться на различные центры событий. Действительны следующие ограничения.
- Удаленные функции должны возвращать табличную схему. Скалярные функции можно получить только в том же хранилище событий.
- Удаленные функции могут принимать только скалярные аргументы. Функции, получающие один или несколько аргументов таблицы, могут быть доступны только в одном хранилище событий.
- Схема результатов удаленных функций должна быть исправлена (известна заранее без выполнения частей запроса). Поэтому конструкции запросов, такие как подключаемый
pivot
модуль, нельзя использовать. Некоторые подключаемые модули, такие как подключаемыйbag_unpack
модуль, поддерживают способ статического обозначения схемы результатов, а в этой форме его можно использовать в вызовах функций между событиями. - По соображениям производительности вызывающий дом событий кэширует схему удаленных сущностей после первоначального вызова. Поэтому изменения, внесенные в удаленную сущность, могут привести к несоответствию с кэшируемыми сведениями схемы, что может привести к сбоям запросов. Дополнительные сведения см. в разделе "Запросы между кластерами" и изменения схемы.
Примеры
Следующий вызов между кластерами действителен.
cluster("OtherCluster").database("SomeDb").MyView("exception") | count
Следующий запрос вызывает удаленную скалярную функцию MyCalc
.
Этот вызов нарушает правило #1, поэтому это недопустимо.
MyTable | extend CalCol=cluster("OtherCluster").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
Следующий запрос вызывает удаленную функцию MyCalc
и предоставляет табличный параметр.
Этот вызов нарушает правило 2, поэтому это недопустимо.
cluster("OtherCluster").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )
Следующий вызов междоменного события действителен.
cluster("OtherEventhouseURI").database("SomeDb").EventView("exception") | count
Следующий запрос вызывает удаленную скалярную функцию EventCalc
.
Этот вызов нарушает правило #1, поэтому это недопустимо.
Eventtable | extend CalCol=cluster("OtherEventhouseClusterURI").database("OtherDb").MyCalc(Col1, Col2, Col3) | take 10
Следующий запрос вызывает удаленную функцию EventCalc
и предоставляет табличный параметр.
Этот вызов нарушает правило 2, поэтому это недопустимо.
cluster("EventhouseClusterURI").database("OtherDb").MyCalc(datatable(x:string, y:string)["x","y"] )
Следующий запрос вызывает удаленную функцию SomeTable
, которая имеет выходные данные схемы переменной на основе параметра tablename
.
Этот вызов нарушает правило 3, поэтому это недопустимо.
Табличная функция в OtherDb
.
.create function SomeTable(tablename:string) { table(tablename) }
В базе данных по умолчанию.
cluster("OtherCluster").database("OtherDb").SomeTable("MyTable")
cluster("OtherEventhouseClusterURI").database("OtherDb").SomeTable("EventTable")
Следующий запрос вызывает удаленную функциюGetDataPivot
, которая имеет выходные данные схемы переменной на основе подключаемого модуля данных (pivot() имеет динамический вывод.
Этот вызов нарушает правило 3, поэтому это недопустимо.
Табличная функция в OtherDb
.
.create function GetDataPivot() { T | evaluate pivot(PivotColumn) }
Табличная функция в базе данных по умолчанию.
cluster("OtherCluster").database("OtherDb").GetDataPivot()
cluster("OtherEventhouseClusterURI").database("OtherDb").GetDataPivot()