Configuración de una base de datos mediante un script del lenguaje de consulta Kusto
Puede ejecutar un script del lenguaje de consulta Kusto para configurar la base de datos durante la implementación de la plantilla de Azure Resource Manager (ARM). Un script es una lista de uno o varios comandos de administración, cada uno separado por un salto de línea y se crea como un recurso al que se accede con la plantilla de ARM.
El script solo puede ejecutar comandos de administración de nivel de base de datos que comiencen con los verbos siguientes:
.create
.create-or-alter
.create-merge
.alter
.alter-merge
.add
Nota
Los comandos admitidos deben ejecutarse en el nivel de base de datos. Por ejemplo, puede modificar una tabla mediante el comando .create-or-alter table
. No se admiten comandos de nivel de clúster, como .alter cluster
directivas.
En general, se recomienda usar la versión idempotente de los comandos para que, si se les llama más de una vez con los mismos parámetros de entrada, no tengan ningún efecto adicional. En otras palabras, ejecutar el comando varias veces tiene el mismo efecto que ejecutarlo una vez. Por ejemplo, siempre que sea posible, se recomienda usar el comando idempotente .create-or-alter
en lugar del comando .create
normal.
Hay varios métodos que puede usar para configurar una base de datos con scripts. En este artículo, nos centramos en los métodos siguientes mediante implementaciones de plantillas de ARM:
- Script en línea: el script se proporciona en línea como un parámetro para una plantilla de ARM en formato JSON.
- Script de Bicep: el script se proporciona como un archivo independiente que una plantilla de ARM de Bicep usa.
- Cuenta de almacenamiento: el script se crea como un blob en una cuenta de Azure Storage y sus detalles (dirección URL y firmas de acceso compartido (SaS) proporcionados como parámetros para la plantilla de ARM.
Nota
Cada clúster puede tener un máximo de 50 scripts (más scripts desencadenarán un Code:TooManyScripts
error). Se recomienda combinar varios scripts pequeños en menos grandes, después de eliminar los scripts existentes para liberar espacio para los nuevos scripts. La eliminación de un script no revierte los comandos que se ejecutaron desde ese script.
Script de ejemplo con comandos de administración
El ejemplo siguiente es un script con comandos que crean dos tablas: MyTable y MyTable2.
.create-merge table MyTable (Level:string, Timestamp:datetime, UserId:string, TraceId:string, Message:string, ProcessId:int32)
.create-merge table MyTable2 (Level:string, Timestamp:datetime, UserId:string, TraceId:string, Message:string, ProcessId:int32)
Observe que los dos comandos son idempotentes. Cuando se ejecutan por primera vez, crean las tablas y, en las ejecuciones posteriores, no tienen ningún efecto.
Requisitos previos
- Suscripción a Azure. Cree una cuenta de Azure gratuita.
- Un clúster y una base de datos de Azure Data Explorer. Cree un clúster y una base de datos.
Seguridad
La entidad de seguridad como, por ejemplo, un usuario o una entidad de servicio, que se usa para implementar un script debe tener los siguientes roles de seguridad:
- Rol Colaborador en el clúster
- Rol Administrador en la base de datos
Importante
La entidad de seguridad que aprovisiona el clúster obtiene automáticamente el rol All Databases Admin
en el clúster.
Script en línea
Use este método para crear una plantilla de ARM con el script definido como parámetro insertado. Si el script tiene uno o varios comandos de administración, separe los comandos por al menos un salto de línea.
Ejecución de un script en línea mediante una plantilla de ARM
En la plantilla siguiente se muestra cómo ejecutar el script mediante una plantilla de Azure Resource Manager en formato JSON.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"kqlScript": {
"defaultValue": ".create-merge table MyTable (Level:string, Timestamp:datetime, UserId:string, TraceId:string, Message:string, ProcessId:int32)\n\n.create-merge table MyTable2 (Level:string, Timestamp:datetime, UserId:string, TraceId:string, Message:string, ProcessId:int32)",
"type": "String"
},
"forceUpdateTag": {
"defaultValue": "[utcNow()]",
"type": "String"
},
"continueOnErrors": {
"defaultValue": false,
"type": "bool"
},
"clusterName": {
"type": "String"
},
"databaseName": {
"type": "String"
},
"scriptName": {
"type": "String"
}
},
"variables": {
},
"resources": [
{
"type": "Microsoft.Kusto/Clusters/Databases/Scripts",
"apiVersion": "2022-02-01",
"name": "[concat(parameters('clusterName'), '/', parameters('databaseName'), '/', parameters('scriptName'))]",
"properties": {
"scriptContent": "[parameters('kqlScript')]",
"continueOnErrors": "[parameters('continueOnErrors')]",
"forceUpdateTag": "[parameters('forceUpdateTag')]"
}
}
],
"outputs": {
}
}
Use la configuración siguiente:
Configuración | Descripción |
---|---|
kqlScript | Script insertado del lenguaje de consulta Kusto Use \n para agregar caracteres de nueva línea. |
forceUpdateTag | Cadena única. Si se cambia, el script se vuelve a aplicar. |
continueOnErrors | Marca que indica si se debe continuar si se produce un error en uno de los comandos. Valor predeterminado: false. |
clusterName | Nombre del clúster donde se ejecuta el script. |
databaseName | Nombre de la base de datos en la que se ejecuta el script. |
scriptName | Nombre del script si se usa un archivo externo para proporcionar el script. Este es el nombre del recurso de la plantilla de ARM real del tipo script. |
Omisión de la etiqueta de actualización
No se recomienda ejecutar un script de KQL en cada implementación de plantilla de ARM ya que consume recursos del clúster. Puede evitar la ejecución del script en implementaciones sucesivas mediante los métodos siguientes:
- Especifique la
forceUpdateTag
propiedad y mantenga el mismo valor entre implementaciones. - Omita la propiedad
forceUpdateTag
o déjela vacía y use el mismo script entre implementaciones.
El procedimiento recomendado es omitir la forceUpdateTag
propiedad para que los cambios de script se ejecuten la próxima vez que se implemente la plantilla. Use solo la propiedad forceUpdateTag
si necesita forzar la ejecución del script.
Script de Bicep
Pasar un script como parámetro a una plantilla puede resultar complicado. La plantilla de Azure Resource Manager de Bicep le permite mantener y conservar el script en un archivo independiente y cargarlo en la plantilla mediante la función loadTextContent de Bicep.
Suponiendo que el script se almacena en un archivo script.kql
ubicado en la misma carpeta que el archivo de Bicep, la plantilla siguiente genera el mismo resultado que el ejemplo anterior:
param forceUpdateTag string = utcNow()
param continueOnErrors bool = false
param clusterName string
param databaseName string
param scriptName string
resource cluster 'Microsoft.Kusto/clusters@2022-02-01' existing = {
name: clusterName
}
resource db 'Microsoft.Kusto/clusters/databases@2022-02-01' existing = {
name: databaseName
parent: cluster
}
resource perfTestDbs 'Microsoft.Kusto/clusters/databases/scripts@2022-02-01' = {
name: scriptName
parent: db
properties: {
scriptContent: loadTextContent('script.kql')
continueOnErrors: continueOnErrors
forceUpdateTag: forceUpdateTag
}
}
Use la configuración siguiente:
Configuración | Descripción |
---|---|
forceUpdateTag | Cadena única. Si se cambia, el script se vuelve a aplicar. |
continueOnErrors | Marca que indica que se debe continuar si se produce un error en uno de los comandos. Valor predeterminado: false. |
clusterName | Nombre del clúster donde se ejecuta el script. |
databaseName | Nombre de la base de datos en la que se ejecuta el script. |
scriptName | Nombre del script si se usa un archivo externo para proporcionar el script. |
La plantilla de Bicep se puede implementar mediante herramientas similares a la plantilla de ARM en formato JSON. Por ejemplo, puede usar los siguientes comandos de la CLI de Azure para implementar la plantilla:
az deployment group create -n "deploy-$(uuidgen)" -g "MyResourceGroup" --template-file "json-sample.json" --parameters clusterName=MyCluster databaseName=MyDb
Las plantillas de Bicep se transpilan en una plantilla de ARM en formato JSON antes de la implementación. En el ejemplo, el archivo de script se inserta insertado en la plantilla de ARM json. Para más información, consulte Información general de Bicep.
Script de la cuenta de almacenamiento
Este método supone que ya tiene un blob en una cuenta de Azure Storage y que proporciona sus detalles (dirección URL y firmas de acceso compartido) directamente en la plantilla de ARM.
Nota:
Los scripts no se pueden cargar desde cuentas de almacenamiento configuradas con un firewall de Azure Storage o reglas de Virtual Network.
Creación del recurso de script
El primer paso consiste en crear un script y cargarlo en una cuenta de almacenamiento.
Cree un script que contenga los comandos de administración que desea usar para crear la tabla en la base de datos.
Cargue el script en la cuenta de Azure Storage. Puede crear la cuenta de almacenamiento mediante Azure Portal, PowerShell o la CLI de Azure.
Proporcione acceso a este archivo mediante firmas de acceso compartido (SaS). Puede proporcionar acceso mediante PowerShell, la CLI de Azure o .NET.
Ejecución de un script mediante una plantilla de ARM
En esta sección, aprenderá a ejecutar un script almacenado en Azure Storage con una plantilla de Azure Resource Manager.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"scriptUrl": {
"type": "String"
},
"scriptUrlSastoken": {
"type": "SecureString"
},
"forceUpdateTag": {
"defaultValue": "[utcNow()]",
"type": "String"
},
"continueOnErrors": {
"defaultValue": false,
"type": "bool"
},
"clusterName": {
"type": "String"
},
"databaseName": {
"type": "String"
},
"scriptName": {
"type": "String"
}
},
"variables": {
},
"resources": [
{
"type": "Microsoft.Kusto/Clusters/Databases/Scripts",
"apiVersion": "2021-01-01",
"name": "[concat(concat(parameters('clusterName'), '/'), concat(parameters('databaseName'), '/'), parameters('scriptName'))]",
"properties": {
"scriptUrl": "[parameters('scriptUrl')]",
"scriptUrlSasToken": "[parameters('scriptUrlSasToken')]",
"continueOnErrors": "[parameters('continueOnErrors')]",
"forceUpdateTag": "[parameters('forceUpdateTag')]"
}
}
],
"outputs": {
}
}
Use la configuración siguiente:
Configuración | Descripción |
---|---|
scriptUrl | Dirección URL del blob. Por ejemplo: 'https://myaccount.blob.core.windows.net/mycontainer/myblob'. |
scriptUrlSastoken | Cadena con las firmas de acceso compartido (SaS). |
forceUpdateTag | Cadena única. Si se cambia, el script se vuelve a aplicar. |
continueOnErrors | Marca que indica si se debe continuar si se produce un error en uno de los comandos. Valor predeterminado: false. |
clusterName | Nombre del clúster donde se ejecuta el script. |
databaseName | Nombre de la base de datos en la que se ejecuta el script. |
scriptName | Nombre del script si se usa un archivo externo para proporcionar el script. |
Limitaciones
- Los scripts solo se admiten en Azure Data Explorer; Los scripts no se admiten en grupos de Data Explorer de Synapse.
- No se pueden agregar, modificar ni quitar dos scripts en paralelo en el mismo clúster. Si esto ocurre, se produce el siguiente error:
Code="ServiceIsInMaintenance"
Puede solucionar el problema colocando una dependencia entre los dos scripts para que se creen o actualicen secuencialmente. - Para crear funciones con consultas entre clústeres mediante scripts, debe establecer la
skipvalidation
propiedadtrue
en en en el comando de función .create.
Solucionar problemas
Los comandos que ejecuta un recurso de script no aparecen en los resultados del comando .show commands-and-queries. Puede realizar un seguimiento de la ejecución del script mediante el comando .show journal.