Konfigurera en databas med hjälp av ett skript med Kusto-frågespråk
Du kan köra ett Kusto-frågespråk skript för att konfigurera databasen under distributionen av ARM-mallen (Azure Resource Management). Ett skript är en lista över ett eller flera hanteringskommandon, var och en avgränsad med en radbrytning, och skapas som en resurs som nås med ARM-mallen.
Skriptet kan bara köra hanteringskommandon på databasnivå som börjar med följande verb:
.create
.create-or-alter
.create-merge
.alter
.alter-merge
.add
Anteckning
Kommandon som stöds måste köras på databasnivå. Du kan till exempel ändra en tabell med kommandot .create-or-alter table
. Kommandon på klusternivå, till exempel .alter cluster
principer, stöds inte.
I allmänhet rekommenderar vi att du använder idempotent-versionen av kommandon så att om de anropas mer än en gång med samma indataparametrar har de ingen ytterligare effekt. Med andra ord har körning av kommandot flera gånger samma effekt som att köra det en gång. Där det är möjligt rekommenderar vi till exempel att du använder kommandot .create-or-alter
idempotent över det vanliga .create
kommandot.
Det finns olika metoder som du kan använda för att konfigurera en databas med skript. I den här artikeln fokuserar vi på följande metoder med arm-malldistributioner:
- Infogat skript: Skriptet tillhandahålls infogat som en parameter till en JSON ARM-mall.
- Bicep-skript: Skriptet tillhandahålls som en separat fil som används av en Bicep ARM-mall.
- Lagringskonto: Skriptet skapas som en blob i ett Azure Storage-konto och dess information (URL och signaturer för delad åtkomst (SaS) tillhandahålls som parametrar till ARM-mallen.
Anteckning
Varje kluster kan ha högst 50 skript (fler skript utlöser ett Code:TooManyScripts
fel.) Vi rekommenderar att du sammanfogar flera små skript till färre stora skript när du har raderat befintliga skript för att frigöra utrymme för nya skript. Om du tar bort ett skript återställs inte de kommandon som kördes från skriptet.
Exempelskript med hanteringskommandon
Följande exempel är ett skript med kommandon som skapar två tabeller: MyTable och 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)
Observera att de två kommandona är idempotent. När de först körs skapar de tabellerna. På efterföljande körningar har de ingen effekt.
Förutsättningar
- En Azure-prenumeration. Skapa ett kostnadsfritt Azure-konto.
- Ett Azure Data Explorer-kluster och en databas. Skapa ett kluster och en databas.
Säkerhet
Huvudnamnet, till exempel en användare eller tjänstens huvudnamn, som används för att distribuera ett skript måste ha följande säkerhetsroller:
- Deltagarroll i klustret
- Admin roll i databasen
Viktigt
Huvudkontot som etablerar klustret hämtar All Databases Admin
automatiskt rollen i klustret.
Infogat skript
Använd den här metoden för att skapa en ARM-mall med skriptet definierat som en infogad parameter. Om skriptet har ett eller flera hanteringskommandon separerar du kommandona med minst en radbrytning.
Köra infogat skript med hjälp av en ARM-mall
Följande mall visar hur du kör skriptet med hjälp av en JSON Azure Resource Manager-mall.
{
"$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": {
}
}
Använd följande inställningar:
Inställningen | Beskrivning |
---|---|
kqlScript | Det infogade Kusto-frågespråk skriptet. Använd \n för att lägga till nya radtecken. |
forceUpdateTag | En unik sträng. Om det ändras tillämpas skriptet igen. |
continueOnErrors | En flagga som anger om du vill fortsätta om något av kommandona misslyckas. Standardvärde: false. |
clusterName | Namnet på klustret där skriptet körs. |
databaseName | Namnet på databasen som skriptet körs under. |
scriptName | Namnet på skriptet när du använder en extern fil för att ange skriptet. Det här är namnet på den faktiska ARM-mallresursen av typen script. |
Utelämna uppdateringstagg
Att köra ett KQL-skript vid varje ARM-malldistribution rekommenderas inte eftersom det förbrukar klusterresurser. Du kan förhindra körning av skriptet i efterföljande distributioner med hjälp av följande metoder:
-
forceUpdateTag
Ange egenskapen och behåll samma värde mellan distributioner. - Utelämna egenskapen
forceUpdateTag
eller lämna den tom och använd samma skript mellan distributionerna.
Det bästa sättet är att utelämna forceUpdateTag
egenskapen så att eventuella skriptändringar körs nästa gång mallen distribueras. Använd forceUpdateTag
endast egenskapen om du behöver tvinga skriptet att köras.
Bicep-skript
Det kan vara besvärligt att skicka ett skript som en parameter till en mall. Med mallen Bicep Azure Resource Manager kan du behålla och underhålla skriptet i en separat fil och läsa in det i mallen med hjälp av Bicep-funktionen loadTextContent.
Förutsatt att skriptet lagras i en fil script.kql
som finns i samma mapp som Bicep-filen, ger följande mall samma resultat som i föregående exempel:
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
}
}
Använd följande inställningar:
Inställningen | Beskrivning |
---|---|
forceUpdateTag | En unik sträng. Om det ändras tillämpas skriptet igen. |
continueOnErrors | En flagga som anger att du vill fortsätta om något av kommandona misslyckas. Standardvärde: false. |
clusterName | Namnet på klustret där skriptet körs. |
databaseName | Namnet på databasen som skriptet körs under. |
scriptName | Namnet på skriptet när du använder en extern fil för att ange skriptet. |
Bicep-mallen kan distribueras med liknande verktyg som JSON ARM-mallen. Du kan till exempel använda följande Azure CLI-kommandon för att distribuera mallen:
az deployment group create -n "deploy-$(uuidgen)" -g "MyResourceGroup" --template-file "json-sample.json" --parameters clusterName=MyCluster databaseName=MyDb
Bicep-mallar överförs till JSON ARM-mallen före distributionen. I exemplet är skriptfilen inbäddad i JSON ARM-mallen. Mer information finns i översikten över Bicep.
Skript för lagringskonto
Den här metoden förutsätter att du redan har en blob i ett Azure Storage-konto och att du anger dess information (URL och signaturer för delad åtkomst (SaS)) direkt i ARM-mallen.
Anteckning
Skript kan inte läsas in från lagringskonton som konfigurerats med en Azure Storage-brandvägg eller Virtual Network regler.
Skapa skriptresursen
Det första steget är att skapa ett skript och ladda upp det till ett lagringskonto.
Skapa ett skript som innehåller de hanteringskommandon som du vill använda för att skapa tabellen i databasen.
Ladda upp skriptet till ditt Azure Storage-konto. Du kan skapa ditt lagringskonto med hjälp av Azure Portal, PowerShell eller Azure CLI.
Ge åtkomst till den här filen med signaturer för delad åtkomst (SaS). Du kan ge åtkomst med Hjälp av PowerShell, Azure CLI eller .NET.
Kör skriptet med hjälp av en ARM-mall
I det här avsnittet får du lära dig hur du kör ett skript som lagras i Azure Storage med en Azure Resource Manager-mall.
{
"$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": {
}
}
Använd följande inställningar:
Inställning | Beskrivning |
---|---|
scriptUrl | URL:en för bloben. Till exempel "https://myaccount.blob.core.windows.net/mycontainer/myblob". |
scriptUrlSastoken | En sträng med signaturer för delad åtkomst (SaS). |
forceUpdateTag | En unik sträng. Om skriptet ändras tillämpas det igen. |
continueOnErrors | En flagga som anger om du vill fortsätta om något av kommandona misslyckas. Standardvärde: false. |
clusterName | Namnet på klustret där skriptet körs. |
databaseName | Namnet på databasen som skriptet körs under. |
scriptName | Namnet på skriptet när du använder en extern fil för att ange skriptet. |
Begränsningar
- Skript stöds bara i Azure Data Explorer; Skript stöds inte i Synapse Data Explorer-pooler.
- Du kan inte lägga till, ändra eller ta bort två skript parallellt i samma kluster. Om detta inträffar utlöses följande fel:
Code="ServiceIsInMaintenance"
Du kan kringgå problemet genom att ange ett beroende mellan de två skripten så att de skapas eller uppdateras i sekvens. - Om du vill skapa funktioner med frågor mellan kluster med hjälp av skript måste du ange
skipvalidation
egenskapen tilltrue
i funktionskommandot .create.
Felsökning
Kommandon som körs av en skriptresurs visas inte i resultatet av kommandot .show commands-and-queries . Du kan spåra skriptkörningen med hjälp av kommandot .show journal .