Azure SQL-databasdistribution

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

Du kan automatiskt distribuera dina databasuppdateringar till Azure SQL-databasen efter varje lyckad version.

DACPAC

Det enklaste sättet att distribuera en databas är att skapa datanivåpaket eller DACPAC. DACPACs kan användas för att paketera och distribuera schemaändringar och data. Du kan skapa en DACPAC med hjälp av SQL-databasprojektet i Visual Studio.

Om du vill distribuera en DACPAC till en Azure SQL-databas lägger du till följande kodfragment i din azure-pipelines.yml-fil.

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

Se även autentiseringsinformation när du använder azure SQL Database-distributionsuppgiften.

SQL-skript

I stället för att använda en DACPAC kan du även använda SQL-skript för att distribuera databasen. Här är ett enkelt exempel på ett SQL-skript som skapar en tom databas.

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

Om du vill köra SQL-skript som en del av en pipeline behöver du Azure PowerShell-skript för att skapa och ta bort brandväggsregler i Azure. Utan brandväggsreglerna kan Azure Pipelines-agenten inte kommunicera med Azure SQL Database.

Följande PowerShell-skript skapar brandväggsregler. Du kan checka in det här skriptet på SetAzureFirewallRule.ps1 din lagringsplats.

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

Klassisk

[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
}

Följande PowerShell-skript tar bort brandväggsregler. Du kan checka in det här skriptet på RemoveAzureFirewallRule.ps1 din lagringsplats.

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

Klassisk

[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
}

Lägg till följande i din azure-pipelines.yml-fil för att köra ett SQL-skript.

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: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      if (-not (Get-Module -ListAvailable -Name SqlServer)) {
          Install-Module -Name SqlServer -Force -AllowClobber
      }
  displayName: 'Install SqlServer module if not present'

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
    Invoke-Sqlcmd -InputFile $(SQLFile) -ServerInstance $(ServerFqdn) -Database $(DatabaseName) -Username $(AdminUser) -Password $(AdminPassword)
  displayName: 'Run SQL script'

- 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-tjänstanslutning

Azure SQL Database-distributionsuppgiften är den primära mekanismen för att distribuera en databas till Azure. Den här uppgiften, precis som med andra inbyggda Azure-uppgifter, kräver en Azure-tjänstanslutning som indata. Azure-tjänstanslutningen lagrar autentiseringsuppgifterna för att ansluta från Azure Pipelines till Azure.

Det enklaste sättet att komma igång med den här uppgiften är att loggas in som en användare som äger både Azure DevOps-organisationen och Azure-prenumerationen. I det här fallet behöver du inte skapa tjänstanslutningen manuellt. Om du vill lära dig hur du skapar en Azure-tjänstanslutning kan du läsa Skapa en Azure-tjänstanslutning.

Information om hur du skapar en Azure-tjänstanslutning finns i Skapa en Azure-tjänstanslutning.

Distribuera villkorligt

Du kan välja att endast distribuera vissa versioner till din Azure-databas.

Om du vill göra detta i YAML kan du använda någon av följande tekniker:

  • Isolera distributionsstegen till ett separat jobb och lägg till ett villkor i jobbet.
  • Lägg till ett villkor i steget.

I följande exempel visas hur du använder stegvillkor för att endast distribuera de byggen som kommer från huvudgrenen.

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

Mer information om villkor finns i Ange villkor.

Fler SQL-åtgärder

SQL Azure Dacpac-distribution kanske inte stöder alla SQL Server-åtgärder som du vill utföra. I dessa fall kan du helt enkelt använda PowerShell- eller kommandoradsskript för att köra de kommandon du behöver. Det här avsnittet visar några vanliga användningsfall för att anropa verktyget SqlPackage.exe. Som en förutsättning för att köra det här verktyget måste du använda en lokalt installerad agent och ha verktyget installerat på din agent.

Kommentar

Om du kör SQLPackage från mappen där den är installerad måste du prefixa sökvägen med & och omsluta den med dubbla citattecken.

Grundläggande syntax

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

Du kan använda något av följande SQL-skript beroende på vilken åtgärd du vill utföra

Extrahera

Skapar en databasögonblicksbildfil (.dacpac) från en live SQL-server eller Microsoft Azure SQL Database.

Kommandosyntax:

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

eller

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

Exempel:

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

Hjälp:

sqlpackage.exe /Action:Extract /?

Publicera

Uppdaterar ett databasschema stegvis så att det matchar schemat för en .dacpac-källfil. Om databasen inte finns på servern skapar publiceringsåtgärden den. Annars uppdateras en befintlig databas.

Kommandosyntax:

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

Exempel:

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

Hjälp:

sqlpackage.exe /Action:Publish /?

Export

Exporterar en livedatabas, inklusive databasschema och användardata, från SQL Server eller Microsoft Azure SQL Database till ett BACPAC-paket (.bacpac-fil).

Kommandosyntax:

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

Exempel:

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

Hjälp:

sqlpackage.exe /Action:Export /?

Importera

Importerar schema- och tabelldata från ett BACPAC-paket till en ny användardatabas i en instans av SQL Server eller Microsoft Azure SQL Database.

Kommandosyntax:

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

Exempel:

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

Hjälp:

sqlpackage.exe /Action:Import /?

DeployReport

Skapar en XML-rapport över de ändringar som skulle göras av en publiceringsåtgärd.

Kommandosyntax:

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

Exempel:

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

Hjälp:

sqlpackage.exe /Action:DeployReport /?

DriftReport

Skapar en XML-rapport över de ändringar som har gjorts i en registrerad databas sedan den senast registrerades.

Kommandosyntax:

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

Exempel:

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

Hjälp:

sqlpackage.exe /Action:DriftReport /?

Skript

Skapar ett transact-SQL-inkrementellt uppdateringsskript som uppdaterar schemat för ett mål så att det matchar schemat för en källa.

Kommandosyntax:

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

Exempel:

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

Hjälp:

sqlpackage.exe /Action:Script /?