Azure SQL Datenbankbereitstellung

Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 | TFS 2017

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 nach jedem erfolgreichen Build automatisch in Azure SQL Datenbank bereitstellen.

DACPAC

Die einfachste Möglichkeit zum Bereitstellen einer Datenbank ist das Erstellen eines Datenebenenpakets oder einer DACPAC-Datei. DACPACs können verwendet werden, um Schemaänderungen sowie Daten zu packen und bereitzustellen. Sie können eine DACPAC-Datei mithilfe des SQL-Datenbankprojekts in Visual Studio erstellen.

Fügen Sie der Datei azure-pipelines.yml den folgenden Codeausschnitt hinzu, um eine DACPAC-Datei in einer Azure SQL-Datenbank bereitzustellen.

- 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-Pipelines sind in TFS nicht verfügbar.

Informationen zur Authentifizierung finden Sie auch bei Verwendung des Azure SQL-Datenbank Bereitstellungstasks.

SQL-Skripts

Anstatt eine DACPAC-Datei zu verwenden, können Sie auch SQL-Skripts verwenden, um Ihre Datenbank bereitzustellen. Hier ist 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

Zum Ausführen von SQL-Skripts als Teil einer Pipeline 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 dieses Skript als SetAzureFirewallRule.ps1 in Ihr Repository einchecken.

ARM

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

Klassisch

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

$ErrorActionPreference = 'Stop'

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

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

Mit dem folgenden PowerShell-Skript werden Firewallregeln entfernt. Sie können dieses Skript als in RemoveAzureFirewall.ps1 Ihr Repository einchecken.

ARM

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

Klassisch

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

$ErrorActionPreference = 'Stop'

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

Fügen Sie Ihrer Datei azure-pipelines.yml Folgendes hinzu, um ein SQL-Skript auszuführen.

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

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

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

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

YAML-Pipelines sind in TFS nicht verfügbar.

Azure-Dienstverbindung

Der Azure SQL-Datenbank Bereitstellungsaufgabe ist der primäre Mechanismus zum Bereitstellen einer Datenbank in Azure. Diese Aufgabe erfordert wie bei anderen integrierten Azure-Aufgaben 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, ist die Anmeldung als Benutzer, der sowohl die Azure DevOps organisation als auch das Azure-Abonnement besitzt. In diesem Fall müssen Sie die Dienstverbindung nicht manuell erstellen. Informationen zum Erstellen einer Azure-Dienstverbindung finden Sie andernfalls unter Erstellen einer Azure-Dienstverbindung.

Informationen zum Erstellen einer Azure-Dienstverbindung finden Sie unter Erstellen einer Azure-Dienstverbindung.

Bedingtes Bereitstellen

Sie können nur bestimmte Builds in Ihrer Azure-Datenbank bereitstellen.

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

  • Isolieren Sie die Bereitstellungsschritte in einem 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 Sie Schrittbedingungen verwenden, um nur die Builds bereitzustellen, die aus dem Hauptverzweigung 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-Pipelines sind in TFS nicht verfügbar.

Zusätzliche SQL-Aktionen

Die 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 häufigsten Anwendungsfälle für den Aufruf des SqlPackage.exe Tools gezeigt. Als Voraussetzung für die Ausführung dieses Tools müssen Sie einen selbstgehosteten Agent verwenden und das Tool auf Ihrem Agent installieren.

Hinweis

Wenn Sie SQLPackage aus dem Ordner ausführen, in dem es installiert ist, müssen Sie dem Pfad ein Präfix voranstellen & und ihn in doppelte Anführungszeichen umschließen.

Grundlegende Syntax

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

Abhängig von der aktion, die Sie ausführen möchten, können Sie eines der folgenden SQL-Skripts verwenden.

Extrahieren

Erstellt eine Datenbankmomentaufnahmedatei (DACPAC-Datei) von einem SQL-Liveserver 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 sie durch den 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, aus SQL Server oder Microsoft Azure SQL-Datenbank 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 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 /?