Azure SQL database deployment (Implementatie van Azure SQL-database)

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

U kunt uw database-updates automatisch implementeren in Azure SQL Database na elke geslaagde build.

DACPAC

De eenvoudigste manier om een database te implementeren, is door een gegevenslaagpakket of DACPAC te maken. DACPACs kunnen worden gebruikt voor het verpakken en implementeren van schemawijzigingen en gegevens. U kunt een DACPAC maken met behulp van het SQL-databaseproject in Visual Studio.

Als u een DACPAC wilt implementeren in een Azure SQL-database, voegt u het volgende codefragment toe aan uw azure-pipelines.yml-bestand.

- 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>'

Zie ook verificatiegegevens bij het gebruik van de Azure SQL Database-implementatietaak.

SQL-scripts

In plaats van een DACPAC te gebruiken, kunt u ook SQL-scripts gebruiken om uw database te implementeren. Hier volgt een eenvoudig voorbeeld van een SQL-script waarmee een lege database wordt gemaakt.

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

Als u SQL-scripts wilt uitvoeren als onderdeel van een pijplijn, hebt u Azure PowerShell-scripts nodig om firewallregels in Azure te maken en te verwijderen. Zonder de firewallregels kan de Azure Pipelines-agent niet communiceren met Azure SQL Database.

Met het volgende PowerShell-script worden firewallregels gemaakt. U kunt dit script inchecken in SetAzureFirewallRule.ps1 uw opslagplaats.

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

Klassiek

[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 -RuleName $FirewallRuleName -ServerName $ServerName
}

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

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

Met het volgende PowerShell-script worden firewallregels verwijderd. U kunt dit script inchecken in RemoveAzureFirewallRule.ps1 uw opslagplaats.

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

Klassiek

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

$ErrorActionPreference = 'Stop'

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

Voeg het volgende toe aan uw azure-pipelines.yml-bestand om een SQL-script uit te voeren.

variables:
  AzureSubscription: '<SERVICE_CONNECTION_NAME>'
  ResourceGroupName: '<RESOURCE_GROUP_NAME>'
  ServerName: '<DATABASE_SERVER_NAME>'
  ServerFqdn: '<DATABASE_FQDN>'
  DatabaseName: '<DATABASE_NAME>'
  AdminUser: '<DATABASE_USERNAME>'
  AdminPassword: '<DATABASE_PASSWORD>'
  SQLFile: '<LOCATION_OF_SQL_FILE_IN_$(Build.SourcesDirectory)>'

steps:
- task: AzurePowerShell@5
  displayName: 'Azure PowerShell script'
  inputs:
    azureSubscription: '$(AzureSubscription)'
    ScriptType: filePath
    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'
  inputs:
    azureSubscription: '$(AzureSubscription)'
    ScriptType: filePath
    ScriptPath: '$(Build.SourcesDirectory)\scripts\RemoveAzureFirewallRule.ps1'
    ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
    azurePowerShellVersion: LatestVersion

Azure-serviceverbinding

De Azure SQL Database-implementatietaak is het primaire mechanisme voor het implementeren van een database in Azure. Deze taak, net als bij andere ingebouwde Azure-taken, vereist een Azure-serviceverbinding als invoer. De Azure-serviceverbinding slaat de referenties op om vanuit Azure Pipelines verbinding te maken met Azure.

De eenvoudigste manier om aan de slag te gaan met deze taak is door u aan temelden als een gebruiker die eigenaar is van zowel de Azure DevOps-organisatie als het Azure-abonnement. In dit geval hoeft u de serviceverbinding niet handmatig te maken. Zie Een Azure-serviceverbinding maken voor meer informatie over het maken van een Azure-serviceverbinding.

Voorwaardelijk implementeren

U kunt ervoor kiezen om alleen bepaalde builds te implementeren in uw Azure-database.

U kunt dit doen in YAML door een van deze technieken te gebruiken:

  • Isoleer de implementatiestappen in een afzonderlijke taak en voeg een voorwaarde toe aan die taak.
  • Voeg een voorwaarde toe aan de stap.

In het volgende voorbeeld ziet u hoe u stapvoorwaarden gebruikt om alleen builds te implementeren die afkomstig zijn van de hoofdbranch.

- 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>'

Zie Voorwaarden opgeven voor meer informatie over voorwaarden.

Meer SQL-acties

SQL Azure Dacpac-implementatie biedt mogelijk geen ondersteuning voor alle SQL-serveracties die u wilt uitvoeren. In deze gevallen kunt u gewoon PowerShell- of opdrachtregelscripts gebruiken om de opdrachten uit te voeren die u nodig hebt. In deze sectie ziet u enkele veelvoorkomende use cases voor het aanroepen van het hulpprogramma SqlPackage.exe. Als vereiste voor het uitvoeren van dit hulpprogramma moet u een zelf-hostende agent gebruiken en het hulpprogramma op uw agent laten installeren.

Notitie

Als u SQLPackage uitvoert vanuit de map waarin het is geïnstalleerd, moet u het pad vooraf laten gaan en & tussen dubbele aanhalingstekens plaatsen.

Basissyntaxis

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

U kunt een van de volgende SQL-scripts gebruiken, afhankelijk van de actie die u wilt uitvoeren

Extraheren

Hiermee maakt u een databasemomentopnamebestand (.dacpac) op basis van een live SQL-server of Microsoft Azure SQL Database.

Opdrachtsyntaxis:

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

or

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

Voorbeeld:

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

Help:

sqlpackage.exe /Action:Extract /?

Publiceren

Hiermee wordt een databaseschema incrementeel bijgewerkt zodat het overeenkomt met het schema van een DACPAC-bronbestand. Als de database niet op de server bestaat, wordt deze door de publicatiebewerking gemaakt. Anders wordt een bestaande database bijgewerkt.

Opdrachtsyntaxis:

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

Voorbeeld:

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

Help:

sqlpackage.exe /Action:Publish /?

Export

Hiermee exporteert u een live database, inclusief databaseschema en gebruikersgegevens, van SQL Server of Microsoft Azure SQL Database naar een BACPAC-pakket (.bacpac-bestand).

Opdrachtsyntaxis:

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

Voorbeeld:

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

Help:

sqlpackage.exe /Action:Export /?

Importeren

Importeert het schema- en tabelgegevens uit een BACPAC-pakket in een nieuwe gebruikersdatabase in een exemplaar van SQL Server of Microsoft Azure SQL Database.

Opdrachtsyntaxis:

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

Voorbeeld:

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

Help:

sqlpackage.exe /Action:Import /?

DeployReport

Hiermee maakt u een XML-rapport van de wijzigingen die door een publicatieactie worden aangebracht.

Opdrachtsyntaxis:

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>"

Voorbeeld:

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" 

Help:

sqlpackage.exe /Action:DeployReport /?

DriftReport

Hiermee maakt u een XML-rapport van de wijzigingen die zijn aangebracht in een geregistreerde database sinds deze voor het laatst is geregistreerd.

Opdrachtsyntaxis:

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

Voorbeeld:

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

Help:

sqlpackage.exe /Action:DriftReport /?

Script

Hiermee maakt u een transact-SQL incrementeel updatescript waarmee het schema van een doel wordt bijgewerkt zodat deze overeenkomt met het schema van een bron.

Opdrachtsyntaxis:

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>"

Voorbeeld:

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"

Help:

sqlpackage.exe /Action:Script /?