Поделиться через


Запросы между кластерами и базами данных

Запросы выполняются с определенной базой данных, назначенной в качестве базы данных в контексте. Эта база данных используется по умолчанию для проверки разрешений. Если в запросе указана ссылка на сущность без указания кластера или базы данных, она разрешается для этой базы данных.

В этой статье объясняется, как выполнять запросы, включающие сущности, расположенные за пределами текущей базы данных контекста.

Предварительные требования

Определение кластера и базы данных в контексте

В следующей таблице объясняется, как определить базу данных в контексте по среде запросов.

Среда База данных в контексте
Kusto Explorer База данных по умолчанию выбирается на панели подключений, а текущий кластер — это кластер, содержащий ее.
Пользовательский веб-интерфейс Azure Data Explorer База данных по умолчанию выбрана в области подключения, а текущий кластер — это кластер, содержащий ее.
Клиентские библиотеки База данных и кластер по умолчанию задаются свойствами Data Source и Initial Catalogстрок подключения Kusto.

Выполнение запросов между кластерами или базами данных

Чтобы получить доступ к сущностям за пределами базы данных в контексте, используйте функции cluster() и database() для определения имени сущности.

Для таблицы в другой базе данных в том же кластере:

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

Для таблицы в удаленном кластере:

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

Примечание

Чтобы выполнить запрос, необходимо иметь разрешение на просмотр базы данных по умолчанию и всех остальных баз данных, на которые ссылается запрос. Дополнительные сведения см. в статье Управление доступом на основе ролей Kusto.

Совет

Количество записей, возвращаемых запросом, ограничено по умолчанию, даже если оператор не используется take . Чтобы снять это ограничение, используйте параметр notruncation клиентского запроса. Дополнительные сведения см. в статье об ограничениях запроса.

Полные имена и оператор объединения

Если полное имя отображается в качестве операнда оператора union, можно использовать подстановочные знаки для указания нескольких таблиц и нескольких баз данных. Подстановочные знаки не допускаются в именах кластеров.

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

Примечание

Имя базы данных по умолчанию также является потенциальным совпадением, поэтому database("*") указывает все таблицы всех баз данных, включая значения по умолчанию.

Полные имена и инструкции ограничения доступа

В инструкцию ограничения доступа также можно включить полные имена или шаблоны. Подстановочные знаки в именах кластеров не допускаются.

Следующий запрос ограничивает доступ к запросу следующими сущностями:

  • Любое имя сущности, начинающееся с my... , в базе данных по умолчанию.
  • Любая таблица во всех базах данных с именем MyOther... текущего кластера.
  • Любая таблица во всех базах данных с именем my2... в кластере OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);

Обработка изменений схемы удаленных сущностей

Чтобы обработать межклассальный запрос, кластер, выполняющий первоначальную интерпретацию запроса, должен иметь схему сущностей, на которые ссылается удаленный кластер. Чтобы получить эти сведения, отправляется команда для извлечения схем, которые затем хранятся в кэше.

В случае изменения схемы в удаленном кластере кэшированная схема может устареть. Это может привести к нежелательным эффектам, включая сценарии, когда новые или удаленные столбцы вызывают .Partial query failure Чтобы устранить такие проблемы, вручную обновите схему с помощью команды .clear cache remote-schema .

Функции и представления

Функции и представления (постоянные и встроенные) могут ссылаться на таблицы в пределах базы данных и кластера. Следующий код является допустимым.

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

Ограничения вызовов функций между кластерами

Табличные функции или представления можно ссылаться в разных кластерах. Действительны следующие ограничения.

  • Удаленные функции должны возвращать табличную схему. Доступ к скалярным функциям можно получить только в одном кластере.
  • Удаленные функции могут принимать только скалярные аргументы. Функции, получающие один или несколько аргументов таблицы, доступны только в одном кластере.
  • Схема результатов удаленных функций должна быть фиксированной (известной заранее без выполнения частей запроса). Это исключает использование конструкций запросов, таких как подключаемый 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"] )

Следующий запрос вызывает удаленную функцию SomeTable , которая имеет переменную схему выходных данных на основе параметра tablename. Этот вызов нарушает правило 3, поэтому он недопустим.

Табличная функция в OtherDb.

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

В базе данных по умолчанию.

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

Следующий запрос вызывает удаленную функцию GetDataPivot , которая имеет переменную схему выходных данных на основе данных (подключаемый модуль pivot() имеет динамические выходные данные). Этот вызов нарушает правило 3, поэтому он недопустим.

Табличная функция в OtherDb.

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

Табличная функция в базе данных по умолчанию.

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