Tutorial: Importieren von SQL-BACPAC-Dateien mit ARM-Vorlagen

Erfahren Sie, wie Sie die Azure SQL-Datenbank-Erweiterung verwenden, um eine BACPAC-Datei mit Azure Resource Manager-Vorlagen (ARM-Vorlagen) zu importieren. Bereitstellungsartefakte sind sämtliche Dateien, die zusätzlich zu Hauptvorlagendateien für eine Bereitstellung benötigt werden. Die BACPAC-Datei ist ein Artefakt.

In diesem Tutorial erstellen Sie eine Vorlage zum Bereitstellen eines logischen SQL-Servers und einer einzelnen Datenbank, und Sie importieren eine BACPAC-Datei. Informationen zum Bereitstellen von Azure-VM-Erweiterungen unter Verwendung von ARM-Vorlagen finden Sie unter Tutorial: Bereitstellen von VM-Erweiterungen mit ARM-Vorlagen.

Dieses Tutorial enthält die folgenden Aufgaben:

  • Vorbereiten einer BACPAC-Datei
  • Öffnen einer Schnellstartvorlage
  • Bearbeiten der Vorlage
  • Stellen Sie die Vorlage bereit.
  • Überprüfen der Bereitstellung

Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Voraussetzungen

Damit Sie die Anweisungen in diesem Artikel ausführen können, benötigen Sie Folgendes:

Vorbereiten einer BACPAC-Datei

Auf GitHub ist eine BACPAC-Datei verfügbar. Informationen zum Erstellen einer eigenen Datei finden Sie unter Exportieren einer Datenbank aus Azure SQL-Datenbank in eine BACPAC-Datei. Wenn Sie die Datei an Ihrem eigenen Standort veröffentlichen möchten, müssen Sie die Vorlage später in diesem Tutorial aktualisieren.

Die BACPAC-Datei muss in einem Azure Storage-Konto gespeichert werden, damit sie mithilfe einer ARM-Vorlage importiert werden kann. Das folgende PowerShell-Skript bereitet die BACPAC-Datei mit den folgenden Schritten vor:

  • Herunterladen der BACPAC-Datei
  • Erstellen eines Azure-Speicherkontos.
  • Erstellen eines Speicherkonto-Blobcontainers
  • Hochladen der BACPAC-Datei in den Container
  • Zeigt den Speicherkontoschlüssel, die Blob-URL, den Ressourcengruppennamen und den Speicherort an.
  1. Wählen Sie Ausprobieren aus, um Cloud Shell zu öffnen. Kopieren Sie dann das folgende PowerShell-Skript, und fügen Sie es im Shellfenster ein.

    $projectName = Read-Host -Prompt "Enter a project name that is used to generate Azure resource names"
    $location = Read-Host -Prompt "Enter the location (i.e. centralus)"
    
    $resourceGroupName = "${projectName}rg"
    $storageAccountName = "${projectName}store"
    $containerName = "bacpacfiles"
    $bacpacFileName = "SQLDatabaseExtension.bacpac"
    $bacpacUrl = "https://github.com/Azure/azure-docs-json-samples/raw/master/tutorial-sql-extension/SQLDatabaseExtension.bacpac"
    
    # Download the bacpac file
    Invoke-WebRequest -Uri $bacpacUrl -OutFile "$HOME/$bacpacFileName"
    
    # Create a resource group
    New-AzResourceGroup -Name $resourceGroupName -Location $location
    
    # Create a storage account
    $storageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroupName `
                                           -Name $storageAccountName `
                                           -SkuName Standard_LRS `
                                           -Location $location
    $storageAccountKey = (Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName `
                                                  -Name $storageAccountName).Value[0]
    
    # Create a container
    New-AzStorageContainer -Name $containerName -Context $storageAccount.Context
    
    # Upload the BACPAC file to the container
    Set-AzStorageBlobContent -File $HOME/$bacpacFileName `
                             -Container $containerName `
                             -Blob $bacpacFileName `
                             -Context $storageAccount.Context
    
    Write-Host "The project name:        $projectName `
      The location:            $location `
      The storage account key: $storageAccountKey `
      The BACPAC file URL:     https://$storageAccountName.blob.core.windows.net/$containerName/$bacpacFileName `
      "
    
    Write-Host "Press [ENTER] to continue ..."
    
  2. Speichern Sie den Speicherkontoschlüssel, die BACPAC-Datei-URL, den Projektnamen und den Speicherort. Sie verwenden diese Werte, wenn Sie die Vorlage später in diesem Tutorial bereitstellen.

Öffnen einer Schnellstartvorlage

Die in diesem Tutorial verwendete Vorlage befindet sich auf GitHub.

  1. Wählen Sie in Visual Studio Code Datei>Datei öffnen aus.

  2. Fügen Sie in Dateiname die folgende URL ein:

    https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/tutorial-sql-extension/azuredeploy.json
    
  3. Wählen Sie Öffnen aus, um die Datei zu öffnen.

    In der Vorlage sind zwei Ressourcen definiert:

    • Microsoft.Sql/servers. Informationen finden Sie in der Vorlagenreferenz.

    • Microsoft.SQL.servers/databases. Informationen finden Sie in der Vorlagenreferenz.

      Bevor Sie die Vorlage anpassen, sollten Sie sich zunächst grundlegend damit vertraut machen.

  4. Wählen Sie Datei>Speichern unter aus, um eine Kopie der Datei als azuredeploy.json auf dem lokalen Computer zu speichern.

Bearbeiten der Vorlage

  1. Fügen Sie am Ende des Abschnitts parameters zwei Parameter hinzu, um den Speicherkontoschlüssel und die BACPAC-URL festzulegen.

        "storageAccountKey": {
          "type":"string",
          "metadata":{
            "description": "Specifies the key of the storage account where the BACPAC file is stored."
          }
        },
        "bacpacUrl": {
          "type":"string",
          "metadata":{
            "description": "Specifies the URL of the BACPAC file."
          }
        }
    

    Fügen Sie nach der schließenden geschweiften Klammer (}) der adminPassword-Eigenschaft ein Komma hinzu. Drücken Sie zum Formatieren der JSON-Datei in Visual Studio Code UMSCHALT+ALT+F.

  2. Fügen Sie der Vorlage zwei Ressourcen hinzu.

    • Damit die SQL-Datenbank-Erweiterung BACPAC-Dateien importieren kann, müssen Sie Datenverkehr von Azure-Diensten zulassen. Wenn der SQL-Server bereitgestellt wird, aktiviert die Firewallregel die Einstellung Anderen Azure-Diensten und -Ressourcen den Zugriff auf diesen Server gestatten.

      Fügen Sie unter der Serverdefinition die folgende Firewallregel hinzu:

      "resources": [
        {
          "type": "firewallrules",
          "apiVersion": "2021-02-01-preview",
          "name": "AllowAllAzureIps",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[parameters('databaseServerName')]"
          ],
          "properties": {
            "startIpAddress": "0.0.0.0",
            "endIpAddress": "0.0.0.0"
          }
        }
      ]
      

      Das folgende Beispiel zeigt die aktualisierte Vorlage:

      Screenshot: Vorlage mit Firewalldefinition

    • Fügen Sie der Datenbankdefinition mithilfe des folgenden JSON-Codes eine SQL-Datenbank-Erweiterungsressource hinzu:

      "resources": [
        {
          "type": "extensions",
          "apiVersion": "2014-04-01",
          "name": "Import",
          "dependsOn": [
            "[resourceId('Microsoft.Sql/servers/databases', parameters('databaseServerName'), parameters('databaseName'))]"
          ],
          "properties": {
            "storageKeyType": "StorageAccessKey",
            "storageKey": "[parameters('storageAccountKey')]",
            "storageUri": "[parameters('bacpacUrl')]",
            "administratorLogin": "[parameters('adminUser')]",
            "administratorLoginPassword": "[parameters('adminPassword')]",
            "operationMode": "Import"
          }
        }
      ]
      

      Das folgende Beispiel zeigt die aktualisierte Vorlage:

      Screenshot: Vorlage mit SQL-Datenbankerweiterung

      Informationen zur Ressourcendefinition finden Sie in der Referenz zur SQL-Datenbank-Erweiterung der API-Version. Im Anschluss sind einige zentrale Elemente aufgeführt:

      • dependsOn Die Erweiterungsressource muss nach der Erstellung der Datenbank erstellt werden.
      • storageKeyType Geben Sie die Art des zu verwendenden Speicherschlüssels an. Der Wert kann entweder StorageAccessKey oder SharedAccessKey sein. Verwenden Sie in diesem Tutorial StorageAccessKey.
      • storageKey Geben Sie den Schlüssel für das Speicherkonto an, in dem die BACPAC-Datei gespeichert ist. Bei Verwendung des Speicherschlüsseltyps SharedAccessKey muss ein Fragezeichen (?) vorangestellt werden.
      • storageUri Geben Sie die URL der in einem Speicherkonto gespeicherten BACPAC-Datei an.
      • administratorLogin: Der Kontoname des SQL-Administrators.
      • administratorLoginPassword: Das Kennwort des SQL-Administrators. Informationen zur Verwendung eines generierten Kennworts finden Sie unter Voraussetzungen.

Das folgende Beispiel zeigt die vollständige Vorlage:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "databaseServerName": {
      "type": "string",
      "defaultValue": "[concat('server-', uniqueString(resourceGroup().id, deployment().name))]",
      "metadata": {
        "description": "Specifies the name for the SQL server"
      }
    },
    "databaseName": {
      "type": "string",
      "defaultValue": "[concat('db-', uniqueString(resourceGroup().id, deployment().name), '-1')]",
      "metadata": {
        "description": "Specifies the name for the SQL database under the SQL server"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Specifies the location for server and database"
      }
    },
    "adminUser": {
      "type": "string",
      "metadata": {
        "description": "Specifies the username for admin"
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Specifies the password for admin"
      }
    },
    "storageAccountKey": {
      "type": "string",
      "metadata": {
        "description": "Specifies the key of the storage account where the BACPAC file is stored."
      }
    },
    "bacpacUrl": {
      "type": "string",
      "metadata": {
        "description": "Specifies the URL of the BACPAC file."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers",
      "apiVersion": "2021-02-01-preview",
      "name": "[parameters('databaseServerName')]",
      "location": "[parameters('location')]",
      "properties": {
        "administratorLogin": "[parameters('adminUser')]",
        "administratorLoginPassword": "[parameters('adminPassword')]",
        "version": "12.0"
      },
      "resources": [
        {
          "type": "firewallrules",
          "apiVersion": "2021-02-01-preview",
          "name": "AllowAllAzureIps",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[parameters('databaseServerName')]"
          ],
          "properties": {
            "startIpAddress": "0.0.0.0",
            "endIpAddress": "0.0.0.0"
          }
        }
      ]
    },
    {
      "type": "Microsoft.Sql/servers/databases",
      "apiVersion": "2021-02-01-preview",
      "name": "[concat(string(parameters('databaseServerName')), '/', string(parameters('databaseName')))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Sql/servers/', parameters('databaseServerName'))]"
      ],
      "resources": [
        {
          "type": "extensions",
          "apiVersion": "2014-04-01",
          "name": "Import",
          "dependsOn": [
            "[resourceId('Microsoft.Sql/servers/databases', parameters('databaseServerName'), parameters('databaseName'))]"
          ],
          "properties": {
            "storageKeyType": "StorageAccessKey",
            "storageKey": "[parameters('storageAccountKey')]",
            "storageUri": "[parameters('bacpacUrl')]",
            "administratorLogin": "[parameters('adminUser')]",
            "administratorLoginPassword": "[parameters('adminPassword')]",
            "operationMode": "Import"
          }
        }
      ]
    }
  ]
}

Bereitstellen der Vorlage

Verwenden Sie den Projektnamen und den Speicherort, die beim Vorbereiten der BACPAC-Datei verwendet wurden. Damit werden alle Ressourcen in derselben Ressourcengruppe gespeichert, was beim Löschen von Ressourcen hilfreich ist.

  1. Melden Sie sich bei Cloud Shell an.

  2. Wählen Sie oben links PowerShell aus.

    Screenshot: Azure Cloud Shell in PowerShell mit der Option zum Hochladen einer Datei

  3. Wählen Sie Dateien hochladen/herunterladen aus, und laden Sie die Datei azuredeploy.json hoch.

  4. Um die Vorlage bereitzustellen, kopieren Sie das folgende Skript, und fügen Sie es im Shellfenster ein.

    $projectName = Read-Host -Prompt "Enter the same project name that is used earlier"
    $adminUsername = Read-Host -Prompt "Enter the SQL admin username"
    $adminPassword = Read-Host -Prompt "Enter the admin password" -AsSecureString
    $storageAccountKey = Read-Host -Prompt "Enter the storage account key"
    $bacpacUrl = Read-Host -Prompt "Enter the URL of the BACPAC file"
    $resourceGroupName = "${projectName}rg"
    
    New-AzResourceGroupDeployment `
        -ResourceGroupName $resourceGroupName `
        -adminUser $adminUsername `
        -adminPassword $adminPassword `
        -TemplateFile "$HOME/azuredeploy.json" `
        -storageAccountKey $storageAccountKey `
        -bacpacUrl $bacpacUrl
    
    Write-Host "Press [ENTER] to continue ..."
    

Überprüfen der Bereitstellung

Wenn Sie über Ihren Clientcomputer auf den Server zugreifen möchten, müssen Sie eine weitere Firewallregel hinzufügen. Die IP-Adresse Ihres Clients und die IP-Adresse, die zum Herstellen der Verbindung mit dem Server verwendet wird, können aufgrund der Netzwerkadressenübersetzung (Network Address Translation, NAT) unterschiedlich sein. Weitere Informationen finden Sie unter IP-Firewallregeln für Azure SQL-Datenbank und Azure SQL Data Warehouse.

Wenn Sie sich beispielsweise beim Abfrage-Editor anmelden, wird eine Meldung angezeigt, dass die IP-Adresse nicht zulässig ist. Die Adresse unterscheidet sich aufgrund der NAT von der IP-Adresse Ihres Clients. Wählen Sie den Link der Nachricht aus, um eine Firewallregel für die IP-Adresse hinzuzufügen. Wenn Sie fertig sind, können Sie die IP-Adresse aus den Einstellungen für Firewalls und virtuelle Netzwerke des Servers löschen.

Wählen Sie im Azure-Portal die Datenbank aus der Ressourcengruppe aus. Wählen Sie Abfrage-Editor (Vorschau) aus, und geben Sie die Administratoranmeldeinformationen ein. Wie Sie sehen, wurden zwei Tabellen in die Datenbank importiert.

Screenshot: Abfrage-Editor (Vorschau) im Azure-Portal

Bereinigen von Ressourcen

Wenn die von Ihnen bereitgestellten Azure-Ressourcen nicht mehr benötigt werden, löschen Sie die Ressourcengruppe. Die Ressourcengruppe, das Speicherkonto, der SQL-Server und die SQL-Datenbanken werden gelöscht.

  1. Geben Sie im Azure-Portal im Suchfeld Ressourcengruppen ein.
  2. Geben Sie den Namen der Ressourcengruppe in das Feld Nach Name filtern ein.
  3. Klicken Sie auf den Namen der Ressourcengruppe.
  4. Wählen Sie die Option Ressourcengruppe löschen.
  5. Um den Löschvorgang zu bestätigen, geben Sie den Namen der Ressourcengruppe ein, und wählen Sie Löschen aus.

Nächste Schritte

In diesem Tutorial haben Sie einen Server und eine Datenbank bereitgestellt und eine BACPAC-Datei importiert. Informationen zur Behandlung von Problemen bei der Bereitstellung von Vorlagen finden Sie unter: