Azure SQL Datenbankbereitstellung

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

Hinweis

In Microsoft Team Foundation Server (TFS) 2018 und früheren Versionen werden Build- und Release-Pipelines als Definitionen bezeichnet, Ausführungen werden als Builds bezeichnet, Dienstverbindungen werden als Dienstendpunkte bezeichnet, Stages werden als Umgebungen bezeichnet und Aufträge werden als Phasen bezeichnet.

Sie können Ihre Datenbankupdates automatisch nach jedem erfolgreichen Build auf Azure SQL Datenbank bereitstellen.

DACPAC

Die einfachste Möglichkeit zum Bereitstellen einer Datenbank besteht darin, Datenebenenpaket oder DACPAC zu erstellen. DACPACs können verwendet werden, um Schemaänderungen und -daten zu verpacken und bereitzustellen. Sie können eine DACPAC mithilfe des SQL-Datenbankprojekts in Visual Studio erstellen.

Fügen Sie zum Bereitstellen einer DACPAC-Datei in eine Azure SQL-Datenbank den folgenden Codeausschnitt zu Ihrer Azure-Pipelines.yml-Datei hinzu.

- task: SqlAzureDacpacDeployment@1
  displayName: Execute Azure SQL : DacpacTask
  inputs:
    azureSubscription: '<Azure service connection>'
    ServerName: '<Database server name>'
    DatabaseName: '<Database name>'
    SqlUsername: '<SQL user name>'
    SqlPassword: '<SQL user password>'
    DacpacFile: '<Location of Dacpac file in $(Build.SourcesDirectory) after compilation>'

YAML wird in TFS nicht unterstützt.

Weitere Authentifizierungsinformationen finden Sie unter Verwendung der Azure SQL Datenbankbereitstellungsaufgabe.

SQL-Skripts

Anstatt eine DACPAC zu verwenden, können Sie auch SQL-Skripts verwenden, um Ihre Datenbank bereitzustellen. Nachfolgend finden Sie ein einfaches Beispiel für ein SQL-Skript, das eine leere Datenbank erstellt.

  USE [main]
  GO
  IF NOT EXISTS (SELECT name FROM main.sys.databases WHERE name = N'DatabaseExample')
  CREATE DATABASE [DatabaseExample]
  GO

Um SQL-Skripts als Teil einer Pipeline auszuführen, benötigen Sie Azure PowerShell Skripts, um Firewallregeln in Azure zu erstellen und zu entfernen. Ohne die Firewallregeln kann der Azure Pipelines-Agent nicht mit Azure SQL Datenbank kommunizieren.

Das folgende PowerShell-Skript erstellt Firewallregeln. Sie können sich in diesem Skript wie SetAzureFirewallRule.ps1 im Repository anmelden.

ARM

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroupName,
  [String] $FirewallRuleName = "AzureWebAppFirewall"
)
$agentIP = (New-Object net.webclient).downloadstring("https://api.ipify.org")
New-AzSqlServerFirewallRule -ResourceGroupName $ResourceGroupName -ServerName $ServerName -FirewallRuleName $FirewallRuleName -StartIPAddress $agentIp -EndIPAddress $agentIP

Klassisch

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroupName,
  [String] $FirewallRuleName = "AzureWebAppFirewall"
)

$ErrorActionPreference = 'Stop'

function New-AzureSQLServerFirewallRule {
  $agentIP = (New-Object net.webclient).downloadstring("https://api.ipify.org")
  New-AzureSqlDatabaseServerFirewallRule -StartIPAddress $agentIp -EndIPAddress $agentIp -FirewallRuleName $FirewallRuleName -ServerName $ServerName -ResourceGroupName $ResourceGroupName
}

function Update-AzureSQLServerFirewallRule{
  $agentIP= (New-Object net.webclient).downloadstring("https://api.ipify.org")
  Set-AzureSqlDatabaseServerFirewallRule -StartIPAddress $agentIp -EndIPAddress $agentIp -FirewallRuleName $FirewallRuleName -ServerName $ServerName -ResourceGroupName $ResourceGroupName
}

if ((Get-AzureSqlDatabaseServerFirewallRule -ServerName $ServerName -FirewallRuleName $FirewallRuleName -ResourceGroupName $ResourceGroupName -ErrorAction SilentlyContinue) -eq $null)
{
  New-AzureSQLServerFirewallRule
}
else
{
  Update-AzureSQLServerFirewallRule
}

Das folgende PowerShell-Skript entfernt Firewallregeln. Sie können dieses Skript wie RemoveAzureFirewallRule.ps1 im Repository einchecken.

ARM

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroupName,
  [String] $FirewallRuleName = "AzureWebAppFirewall"
)
Remove-AzSqlServerFirewallRule -ServerName $ServerName -FirewallRuleName $FirewallRuleName -ResourceGroupName $ResourceGroupName

Klassisch

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroupName,
  [String] $FirewallRuleName = "AzureWebAppFirewall"
)

$ErrorActionPreference = 'Stop'

if ((Get-AzureSqlDatabaseServerFirewallRule -ServerName $ServerName -FirewallRuleName $FirewallRuleName -ResourceGroupName $ResourceGroupName -ErrorAction SilentlyContinue))
{
  Remove-AzureSqlDatabaseServerFirewallRule -FirewallRuleName $FirewallRuleName -ServerName $ServerName -ResourceGroupName $ResourceGroupName
}

Fügen Sie die folgende Datei zu Ihrer Azure-Pipelines.yml-Datei hinzu, um ein SQL-Skript auszuführen.

variables:
  AzureSubscription: '<Azure service connection>'
  ServerName: '<Database server name>'
  ServerFqdn: '<SQL Database FQDN>'
  DatabaseName: '<Database name>'
  AdminUser: '<SQL user name>'
  AdminPassword: '<SQL user password>'
  SQLFile: '<Location of SQL file in $(Build.SourcesDirectory)>'

steps:
- task: AzurePowerShell@5
  displayName: Azure PowerShell script: FilePath
  inputs:
    azureSubscription: '$(AzureSubscription)'
    ScriptPath: '$(Build.SourcesDirectory)\scripts\SetAzureFirewallRule.ps1'
    ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
    azurePowerShellVersion: LatestVersion

- task: CmdLine@2
  displayName: Run Sqlcmd
  inputs:
    filename: Sqlcmd
  arguments: '-S $(ServerFqdn) -U $(AdminUser) -P $(AdminPassword) -d $(DatabaseName) -i $(SQLFile)'

- task: AzurePowerShell@5
  displayName: Azure PowerShell script: FilePath
  inputs:
    azureSubscription: '$(AzureSubscription)'
    ScriptPath: '$(Build.SourcesDirectory)\scripts\RemoveAzureFirewallRule.ps1'
    ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
    azurePowerShellVersion: LatestVersion

YAML wird in TFS nicht unterstützt.

Azure-Dienstverbindung

Die Azure SQL Datenbankbereitstellungsaufgabe ist der primäre Mechanismus zum Bereitstellen einer Datenbank in Azure. Diese Aufgabe, wie bei anderen integrierten Azure-Aufgaben, erfordert eine Azure-Dienstverbindung als Eingabe. Die Azure-Dienstverbindung speichert die Anmeldeinformationen, um eine Verbindung von Azure-Pipelines oder TFS mit Azure herzustellen.

Die einfachste Möglichkeit, mit dieser Aufgabe zu beginnen, besteht darin, als Benutzer angemeldet zu werden, der sowohl die Azure DevOps-Organisation als auch das Azure-Abonnement besitzt. In diesem Fall müssen Sie die Dienstverbindung nicht manuell erstellen. Andernfalls erfahren Sie, wie Sie eine Azure-Dienstverbindung erstellen, siehe Erstellen einer Azure-Dienstverbindung.

Bereitstellen bedingter Bereitstellung

Sie können sich entscheiden, nur bestimmte Builds in Ihrer Azure-Datenbank bereitzustellen.

Dazu können Sie in YAML eine der folgenden Techniken verwenden:

  • Isolieren Sie die Bereitstellungsschritte in einen separaten Auftrag, und fügen Sie diesem Auftrag eine Bedingung hinzu.
  • Fügen Sie dem Schritt eine Bedingung hinzu.

Im folgenden Beispiel wird gezeigt, wie Schrittbedingungen verwendet werden, um nur diese Builds bereitzustellen, die aus hauptzweigen stammen.

- task: SqlAzureDacpacDeployment@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<Azure service connection>'
    ServerName: '<Database server name>'
    DatabaseName: '<Database name>'
    SqlUsername: '<SQL user name>'
    SqlPassword: '<SQL user password>'
    DacpacFile: '<Location of Dacpac file in $(Build.SourcesDirectory) after compilation>'

Weitere Informationen zu Bedingungen finden Sie unter Angeben von Bedingungen.

YAML wird in TFS nicht unterstützt.

Weitere SQL-Aktionen

SQL Azure Dacpac-Bereitstellung unterstützt möglicherweise nicht alle SQL Server-Aktionen, die Sie ausführen möchten. In diesen Fällen können Sie einfach PowerShell- oder Befehlszeilenskripts verwenden, um die benötigten Befehle auszuführen. In diesem Abschnitt werden einige der allgemeinen Anwendungsfälle zum Aufrufen des SqlPackage.exe-Tools gezeigt. Als Voraussetzung für die Ausführung dieses Tools müssen Sie einen selbst gehosteten Agent verwenden und das Tool auf Ihrem Agent installiert haben.

Hinweis

Wenn Sie SQLPackage aus dem Ordner ausführen, in dem es installiert ist, müssen Sie den Pfad & präfixieren und in doppelte Anführungszeichen umschließen.

Grundlegende Syntax

<Path of SQLPackage.exe> <Arguments to SQLPackage.exe>

Sie können je nach aktion, die Sie ausführen möchten, eine der folgenden SQL-Skripts verwenden.

Extrahieren

Erstellt eine Datenbankaufnahmedatei (.dacpac) aus einem Live-SQL-Server oder Microsoft Azure SQL-Datenbank.

Befehlssyntax:

SqlPackage.exe /TargetFile:"<Target location of dacpac file>" /Action:Extract
/SourceServerName:"<ServerName>.database.windows.net"
/SourceDatabaseName:"<DatabaseName>" /SourceUser:"<Username>" /SourcePassword:"<Password>"

oder

SqlPackage.exe /action:Extract /tf:"<Target location of dacpac file>"
/SourceConnectionString:"Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=SSPI;Persist Security Info=False;"

Beispiel:

SqlPackage.exe /TargetFile:"C:\temp\test.dacpac" /Action:Extract /SourceServerName:"DemoSqlServer.database.windows.net"
 /SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"

Hilfe:

sqlpackage.exe /Action:Extract /?

Veröffentlichen

Aktualisiert ein Datenbankschema inkrementell, sodass dieses dem Schema einer DACPAC-Quelldatei entspricht Wenn die Datenbank auf dem Server nicht vorhanden ist, wird der Veröffentlichungsvorgang erstellt. Andernfalls wird eine bestehende Datenbank aktualisiert.

Befehlssyntax:

SqlPackage.exe /SourceFile:"<Dacpac file location>" /Action:Publish /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password> "

Beispiel:

SqlPackage.exe /SourceFile:"E:\dacpac\ajyadb.dacpac" /Action:Publish /TargetServerName:"DemoSqlServer.database.windows.net"
/TargetDatabaseName:"Testdb4" /TargetUser:"ajay" /TargetPassword:"SQLPassword"

Hilfe:

sqlpackage.exe /Action:Publish /?

Exportieren

Exportiert eine Livedatenbank, einschließlich Datenbankschema und Benutzerdaten, von SQL Server oder Microsoft Azure SQL-Datenbank in ein BACPAC-Paket (Bacpac-Datei).

Befehlssyntax:

SqlPackage.exe /TargetFile:"<Target location for bacpac file>" /Action:Export /SourceServerName:"<ServerName>.database.windows.net"
/SourceDatabaseName:"<DatabaseName>" /SourceUser:"<Username>" /SourcePassword:"<Password>"

Beispiel:

SqlPackage.exe /TargetFile:"C:\temp\test.bacpac" /Action:Export /SourceServerName:"DemoSqlServer.database.windows.net"
/SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"

Hilfe:

sqlpackage.exe /Action:Export /?

Importieren

Importiert die Schema- und Tabellendaten aus einem BACPAC-Paket in eine neue Benutzerdatenbank in einer Instanz von SQL Server oder Microsoft Azure SQL-Datenbank.

Befehlssyntax:

SqlPackage.exe /SourceFile:"<Bacpac file location>" /Action:Import /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password>"

Beispiel:

SqlPackage.exe /SourceFile:"C:\temp\test.bacpac" /Action:Import /TargetServerName:"DemoSqlServer.database.windows.net"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword"

Hilfe:

sqlpackage.exe /Action:Import /?

DeployReport

Erstellt einen XML-Bericht der Änderungen, die durch eine Veröffentlichungsaktion vorgenommen würden

Befehlssyntax:

SqlPackage.exe /SourceFile:"<Dacpac file location>" /Action:DeployReport /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password>" /OutputPath:"<Output XML file path for deploy report>"

Beispiel:

SqlPackage.exe /SourceFile:"E: \dacpac\ajyadb.dacpac" /Action:DeployReport /TargetServerName:"DemoSqlServer.database.windows.net"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\deployReport.xml" 

Hilfe:

sqlpackage.exe /Action:DeployReport /?

DriftReport

Erstellt einen XML-Bericht der Änderungen, die seit der letzten Registrierung an einer registrierten Datenbank vorgenommen wurden.

Befehlssyntax:

SqlPackage.exe /Action:DriftReport /TargetServerName:"<ServerName>.database.windows.net" /TargetDatabaseName:"<DatabaseName>"
/TargetUser:"<Username>" /TargetPassword:"<Password>" /OutputPath:"<Output XML file path for drift report>"

Beispiel:

SqlPackage.exe /Action:DriftReport /TargetServerName:"DemoSqlServer.database.windows.net" /TargetDatabaseName:"Testdb"
/TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\driftReport.xml"

Hilfe:

sqlpackage.exe /Action:DriftReport /?

Skript

Erstellt ein inkrementelles Transact-SQL-Updateskript, durch das das Schema eines Ziels aktualisiert wird, sodass es dem Schema einer Quelle entspricht.

Befehlssyntax:

SqlPackage.exe /SourceFile:"<Dacpac file location>" /Action:Script /TargetServerName:"<ServerName>.database.windows.net"
/TargetDatabaseName:"<DatabaseName>" /TargetUser:"<Username>" /TargetPassword:"<Password>" /OutputPath:"<Output SQL script file path>"

Beispiel:

SqlPackage.exe /Action:Script /SourceFile:"E:\dacpac\ajyadb.dacpac" /TargetServerName:"DemoSqlServer.database.windows.net"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\test.sql"
/Variables:StagingDatabase="Staging DB Variable value"

Hilfe:

sqlpackage.exe /Action:Script /?