Configurare un database usando uno script del Linguaggio di query Kusto
È possibile eseguire uno script di Linguaggio di query Kusto per configurare il database durante la distribuzione del modello di Gestione risorse di Azure. Uno script è un elenco di uno o più comandi di gestione, ognuno separato da un'interruzione di riga e viene creato come risorsa a cui si accede con il modello di Resource Manager.
Lo script può eseguire solo comandi di gestione a livello di database che iniziano con i verbi seguenti:
.create
.create-or-alter
.create-merge
.alter
.alter-merge
.add
Nota
I comandi supportati devono essere eseguiti a livello di database. Ad esempio, è possibile modificare una tabella usando il comando .create-or-alter table
. I comandi a livello di cluster, ad esempio .alter cluster
i criteri, non sono supportati.
In generale, è consigliabile usare la versione idempotente dei comandi in modo che, se vengono chiamati più volte con gli stessi parametri di input, non hanno alcun effetto aggiuntivo. In altre parole, l'esecuzione del comando più volte ha lo stesso effetto dell'esecuzione una sola volta. Se possibile, ad esempio, è consigliabile usare il comando .create-or-alter
idempotente sul comando normale .create
.
Esistono diversi metodi che è possibile usare per configurare un database con script. In questo articolo vengono illustrati i metodi seguenti usando le distribuzioni di modelli di Resource Manager:
- Script inline: lo script viene fornito inline come parametro per un modello di Resource Manager JSON.
- Script Bicep: lo script viene fornito come file separato usato da un modello di Resource Manager Bicep.
- Account di archiviazione: lo script viene creato come BLOB in un account di archiviazione di Azure e i relativi dettagli (URL e firme di accesso condiviso) forniti come parametri per il modello di Resource Manager.
Nota
Ogni cluster può avere un massimo di 50 script (più script attiveranno un Code:TooManyScripts
errore). È consigliabile unire più script di piccole dimensioni in meno grandi, dopo aver eliminato gli script esistenti per liberare spazio per i nuovi script. L'eliminazione di uno script non esegue il rollback dei comandi eseguiti da tale script.
Script di esempio con comandi di gestione
L'esempio seguente è uno script con comandi che creano due tabelle: MyTable e 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)
Si noti che i due comandi sono idempotenti. Quando viene eseguita per la prima volta, creano le tabelle, nelle esecuzioni successive non hanno alcun effetto.
Prerequisiti
- Una sottoscrizione di Azure. Creare un account Azure gratuito.
- Un cluster e un database di Esplora dati di Azure. Creare un cluster e un database.
Sicurezza
L'entità, ad esempio un utente o un'entità servizio, usata per distribuire uno script deve avere i ruoli di sicurezza seguenti:
- Ruolo collaboratore nel cluster
- Ruolo di amministratore nel database
Importante
Il provisioning principale del cluster ottiene automaticamente il All Databases Admin
ruolo nel cluster.
Script inline
Usare questo metodo per creare un modello di Resource Manager con lo script definito come parametro inline. Se lo script dispone di uno o più comandi di gestione, separare i comandi per almeno un'interruzione di riga.
Eseguire script inline usando un modello di Resource Manager
Il modello seguente illustra come eseguire lo script usando un modello di Azure Resource Manager 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": {
}
}
Utilizzare le seguenti impostazioni:
Impostazione | Descrizione |
---|---|
kqlScript | Script Linguaggio di query Kusto inline. Usare \n per aggiungere nuovi caratteri di riga. |
forceUpdateTag | Stringa univoca. Se modificato, lo script viene nuovamente applicato. |
continueOnErrors | Flag che indica se continuare se uno dei comandi ha esito negativo. Valore predefinito: false. |
clusterName | Nome del cluster in cui viene eseguito lo script. |
databaseName | Nome del database in cui viene eseguito lo script. |
scriptName | Nome dello script quando si usa un file esterno per fornire lo script. Si tratta del nome della risorsa modello di Resource Manager effettiva di tipo script. |
Omettere il tag di aggiornamento
L'esecuzione di uno script KQL in ogni distribuzione di modelli di Resource Manager non è consigliata perché usa le risorse del cluster. È possibile impedire l'esecuzione dello script in distribuzioni consecutive usando i metodi seguenti:
- Specificare la
forceUpdateTag
proprietà e mantenere lo stesso valore tra le distribuzioni. - Omettere la
forceUpdateTag
proprietà o lasciarla vuota e usare lo stesso script tra le distribuzioni.
La procedura consigliata consiste nell'omettere la forceUpdateTag
proprietà in modo che tutte le modifiche dello script vengano eseguite alla successiva distribuzione del modello. Usare la forceUpdateTag
proprietà solo se è necessario forzare l'esecuzione dello script.
Script Bicep
Il passaggio di uno script come parametro a un modello può essere complesso. Il modello bicep di Azure Resource Manager consente di mantenere e gestire lo script in un file separato e caricarlo nel modello usando la funzione loadTextContent Bicep.
Supponendo che lo script sia archiviato in un file script.kql
che si trova nella stessa cartella del file Bicep, il modello seguente produce lo stesso risultato dell'esempio precedente:
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
}
}
Utilizzare le seguenti impostazioni:
Impostazione | Descrizione |
---|---|
forceUpdateTag | Stringa univoca. Se modificato, lo script viene nuovamente applicato. |
continueOnErrors | Flag che indica di continuare se uno dei comandi ha esito negativo. Valore predefinito: false. |
clusterName | Nome del cluster in cui viene eseguito lo script. |
databaseName | Nome del database in cui viene eseguito lo script. |
scriptName | Nome dello script quando si usa un file esterno per fornire lo script. |
Il modello Bicep può essere distribuito usando strumenti simili come il modello di Resource Manager JSON. Ad esempio, è possibile usare i comandi seguenti dell'interfaccia della riga di comando di Azure per distribuire il modello:
az deployment group create -n "deploy-$(uuidgen)" -g "MyResourceGroup" --template-file "json-sample.json" --parameters clusterName=MyCluster databaseName=MyDb
I modelli Bicep vengono traspilati nel modello ARM JSON prima della distribuzione. Nell'esempio il file di script è incorporato inline nel modello DI Resource Manager JSON. Per altre informazioni, vedere Panoramica di Bicep.
Script dell'account di archiviazione
Questo metodo presuppone che sia già presente un BLOB in un account Archiviazione di Azure e si forniscano i relativi dettagli (URL e firme di accesso condiviso) direttamente nel modello di Resource Manager.
Nota
Gli script non possono essere caricati dagli account di archiviazione configurati con un firewall Archiviazione di Azure o regole di Rete virtuale.
Creare la risorsa script
Il primo passaggio consiste nel creare uno script e caricarlo in un account di archiviazione.
Creare uno script contenente i comandi di gestione da usare per creare la tabella nel database.
Caricare lo script nell'account Archiviazione di Azure. È possibile creare l'account di archiviazione usando il portale di Azure, PowerShell o l'interfaccia della riga di comando di Azure.
Fornire l'accesso a questo file usando le firme di accesso condiviso (SaS). È possibile fornire l'accesso usando PowerShell, l'interfaccia della riga di comando di Azure o .NET.
Eseguire lo script usando un modello di Resource Manager
In questa sezione viene illustrato come eseguire uno script archiviato in Archiviazione di Azure con un modello di 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": {
}
}
Utilizzare le seguenti impostazioni:
Impostazione | Descrizione |
---|---|
scriptUrl | URL del BLOB. Ad esempio, 'https://myaccount.blob.core.windows.net/mycontainer/myblob'. |
scriptUrlSastoken | Stringa con le firme di accesso condiviso (SaS). |
forceUpdateTag | Stringa univoca. Se modificato, lo script viene nuovamente applicato. |
continueOnErrors | Flag che indica se continuare se uno dei comandi ha esito negativo. Valore predefinito: false. |
clusterName | Nome del cluster in cui viene eseguito lo script. |
databaseName | Nome del database in cui viene eseguito lo script. |
scriptName | Nome dello script quando si usa un file esterno per fornire lo script. |
Limiti
- Gli script sono supportati solo in Azure Esplora dati; Gli script non sono supportati nei pool di Esplora dati Synapse.
- Non è possibile aggiungere, modificare o rimuovere due script in parallelo nello stesso cluster. In questo caso, viene generato l'errore seguente:
Code="ServiceIsInMaintenance"
È possibile risolvere il problema inserendo una dipendenza tra i due script in modo che vengano creati o aggiornati in sequenza. - Per creare funzioni con query tra cluster usando script, è necessario impostare la
skipvalidation
proprietà sutrue
nel comando .create function.
Risoluzione dei problemi
I comandi eseguiti da una risorsa script non vengono visualizzati nei risultati del comando .show commands-and-queries . È possibile tracciare l'esecuzione dello script usando il comando .show journal .