Consultas entre clústeres y entre bases de datos

Las consultas se ejecutan con una base de datos determinada designada como base de datos en contexto. Esta base de datos actúa como valor predeterminado para la comprobación de permisos. Si se hace referencia a una entidad en una consulta sin especificar el clúster o la base de datos, se resuelve en esta base de datos.

En este artículo se explica cómo ejecutar consultas que implican entidades ubicadas fuera de la base de datos de contexto actual.

Requisitos previos

Identificación del clúster y la base de datos en contexto

En la tabla siguiente se explica cómo identificar la base de datos en contexto por entorno de consulta.

Entorno Base de datos en contexto
Kusto Explorer La base de datos predeterminada es la seleccionada en el panel de conexiones y el clúster actual es el clúster que contiene esa base de datos.
Interfaz de usuario web de Azure Data Explorer La base de datos predeterminada es la seleccionada en el panel de conexión y el clúster actual es el clúster que contiene esa base de datos.
Bibliotecas de cliente La base de datos y el clúster predeterminados se especifican mediante las Data Source propiedades y Initial Catalog de las cadenas de conexión de Kusto.

Realizar consultas entre clústeres o entre bases de datos

Para acceder a entidades fuera de la base de datos en contexto, use las funciones cluster() y database() para calificar el nombre de entidad.

Para una tabla de una base de datos diferente dentro del mismo clúster:

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

Para una tabla de un clúster remoto:

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

Nota

Para ejecutar una consulta, debe tener permiso de visor para la base de datos predeterminada y para todas las demás bases de datos a las que se hace referencia en la consulta. Para obtener más información, consulte Control de acceso basado en roles de Kusto.

Sugerencia

El número de registros devueltos desde una consulta está limitado de forma predeterminada, incluso si no hay ningún uso específico del take operador. Para eliminar este límite, use la opción de solicitud de cliente notruncation . Para más información, consulte Límites de la consulta.

Nombres calificados y el operador de unión

Cuando un nombre completo aparece como operando del operador union, se pueden usar caracteres comodín para especificar varias tablas y varias bases de datos. Los caracteres comodín no se permiten en los nombres de clúster.

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

Nota

El nombre de la base de datos predeterminada también es una coincidencia potencial, por lo que database("*") especifica todas las tablas de todas las bases de datos, incluido el valor predeterminado.

Nombres calificados y restricción de instrucciones de acceso

Los nombres o patrones completos también se pueden incluir en la instrucción restrict access . No se permiten caracteres comodín en los nombres de clúster.

La consulta siguiente restringe el acceso de consulta a las siguientes entidades:

  • Cualquier nombre de entidad que empiece por my... en la base de datos predeterminada.
  • Cualquier tabla de todas las bases de datos denominadas MyOther... del clúster actual.
  • Cualquier tabla de todas las bases de datos denominadas my2... en el clúster OtherCluster.kusto.windows.net.
restrict access to (my*, database("MyOther*").*, cluster("OtherCluster").database("my2*").*);

Controlar los cambios de esquema de las entidades remotas

Para procesar una consulta entre clústeres, el clúster que realiza la interpretación inicial de la consulta debe tener el esquema de las entidades a las que se hace referencia en clústeres remotos. Para obtener esta información, se envía un comando para recuperar los esquemas, que a continuación se almacenan en una memoria caché.

En caso de un cambio de esquema en el clúster remoto, un esquema almacenado en caché puede quedar obsoleto. Esto puede provocar efectos no deseados, incluidos escenarios en los que las columnas nuevas o eliminadas provocan un Partial query failure. Para resolver estos problemas, actualice manualmente el esquema con el comando remote-schema .clear cache .

Funciones y vistas

Las funciones y vistas (persistentes y creadas insertadas) pueden hacer referencia a tablas a través de los límites de la base de datos y del clúster. El código siguiente es válido.

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

Se puede acceder a las funciones y vistas persistentes desde otra base de datos del mismo clúster.

Por ejemplo, supongamos que crea la siguiente función tabular (vista) en una base de datos OtherDb:

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

A continuación, creará la siguiente función escalar en una base de datos OtherDb:

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

En la base de datos predeterminada, se puede hacer referencia a estas entidades de la siguiente manera:

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

Limitaciones de las llamadas a funciones entre clústeres

Se puede hacer referencia a las funciones tabulares o vistas entre clústeres. Se aplican las siguientes limitaciones:

  • Las funciones remotas deben devolver el esquema tabular. Solo se puede acceder a las funciones escalares en el mismo clúster.
  • Las funciones remotas solo pueden aceptar argumentos escalares. Solo se puede acceder a las funciones que obtienen uno o varios argumentos de tabla en el mismo clúster.
  • El esquema de resultados de las funciones remotas debe corregirse (conocido de antemano sin ejecutar partes de la consulta). Esto impide el uso de construcciones de consulta como el pivot complemento. (Tenga en cuenta que algunos complementos, como el bag_unpack complemento, admiten una manera de indicar el esquema de resultados estáticamente y, en este formato, se pueden usar en llamadas a funciones entre clústeres).
  • Por motivos de rendimiento, el clúster que realiza la llamada almacena en caché el esquema de entidades remotas después de la llamada inicial. Por lo tanto, los cambios realizados en la entidad remota pueden dar lugar a una discrepancia con la información de esquema almacenada en caché, lo que podría provocar errores de consulta. Para obtener más información, consulte Consultas entre clústeres y cambios de esquema.

Ejemplos

La siguiente llamada entre clústeres es válida.

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

La consulta siguiente llama a una función MyCalcescalar remota . Esta llamada infringe la regla 1, por lo que no es válida.

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

La consulta siguiente llama a la función MyCalc remota y proporciona un parámetro tabular. Esta llamada infringe la regla 2, por lo que no es válida.

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

La consulta siguiente llama a la función SomeTable remota que tiene una salida de esquema de variable basada en el parámetro tablename. Esta llamada infringe la regla 3, por lo que no es válida.

Función tabular en OtherDb.

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

En la base de datos predeterminada.

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

La consulta siguiente llama a una función GetDataPivot remota que tiene una salida de esquema variable basada en los datos (pivot() plugin tiene salida dinámica). Esta llamada infringe la regla 3, por lo que no es válida.

Función tabular en OtherDb.

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

Función tabular en la base de datos predeterminada.

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