Nasazení služby Azure SQL Database

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

Po každém úspěšném sestavení můžete do databáze Azure SQL automaticky nasadit aktualizace databáze.

DACPAC

Nejjednodušší způsob, jak nasadit databázi, je vytvořit balíček datové vrstvy nebo DACPAC. DaCPACs lze použít k zabalení a nasazení změn schématu a dat. DaCPAC můžete vytvořit pomocí projektu databáze SQL v sadě Visual Studio.

Pokud chcete nasadit DACPAC do databáze Azure SQL, přidejte do souboru azure-pipelines.yml následující fragment kódu.

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

Přečtěte si také informace o ověřování při použití úlohy nasazení služby Azure SQL Database.

Skripty SQL

Místo použití jazyka DACPAC můžete k nasazení databáze použít také skripty SQL. Tady je jednoduchý příklad skriptu SQL, který vytvoří prázdnou databázi.

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

Abyste mohli spouštět skripty SQL jako součást kanálu, budete potřebovat skripty Azure PowerShellu k vytvoření a odebrání pravidel brány firewall v Azure. Bez pravidel brány firewall nemůže agent Azure Pipelines komunikovat se službou Azure SQL Database.

Následující skript PowerShellu vytvoří pravidla brány firewall. Tento skript můžete vrátit se změnami jako SetAzureFirewallRule.ps1 v úložišti.

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

Klasické

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

Následující skript PowerShellu odebere pravidla brány firewall. Tento skript můžete vrátit se změnami jako RemoveAzureFirewallRule.ps1 v úložišti.

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

Klasické

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

Do souboru azure-pipelines.yml přidejte následující kód pro spuštění skriptu SQL.

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

Připojení ke službě Azure

Úloha nasazení služby Azure SQL Database je primárním mechanismem nasazení databáze do Azure. Tato úloha, stejně jako u dalších předdefinovaných úloh Azure, vyžaduje připojení služby Azure jako vstup. Připojení služby Azure ukládá přihlašovací údaje pro připojení z Azure Pipelines k Azure.

Nejjednodušší způsob, jak začít s touto úlohou, je přihlásit se jako uživatel, který vlastní organizaci Azure DevOps i předplatné Azure. V takovém případě nebudete muset připojení služby vytvořit ručně. V opačném případě se dozvíte, jak vytvořit připojení služby Azure, viz Vytvoření připojení služby Azure.

Informace o vytvoření připojení služby Azure najdete v tématu Vytvoření připojení služby Azure.

Podmíněné nasazení

Můžete se rozhodnout, že do databáze Azure nasadíte jenom určitá sestavení.

K tomu v YAML můžete použít jednu z těchto technik:

  • Izolujte kroky nasazení do samostatné úlohy a přidejte do této úlohy podmínku.
  • Přidejte do kroku podmínku.

Následující příklad ukazuje, jak pomocí podmínek kroku nasadit pouze sestavení pocházející z hlavní větve.

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

Další informace o podmínkách najdete v tématu Určení podmínek.

Další akce SQL

Nasazení SQL Azure Dacpac nemusí podporovat všechny akce SQL Serveru, které chcete provést. V těchto případech můžete k spuštění potřebných příkazů jednoduše použít PowerShell nebo skripty příkazového řádku. Tato část ukazuje některé běžné případy použití pro vyvolání nástroje SqlPackage.exe. Jako předpoklad pro spuštění tohoto nástroje musíte použít agenta v místním prostředí a mít na agenta nainstalovaný nástroj.

Poznámka:

Pokud spustíte SQLPackage ze složky, ve které je nainstalovaná, musíte předponu cesty & zadat a zabalit ji do dvojitých uvozovek.

Základní syntaxe

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

V závislosti na akci, kterou chcete provést, můžete použít libovolný z následujících skriptů SQL.

Extrahovat

Vytvoří soubor snímku databáze (.dacpac) z živého SQL serveru nebo služby Microsoft Azure SQL Database.

Syntaxe příkazu:

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

nebo

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

Příklad:

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

Pomoc:

sqlpackage.exe /Action:Extract /?

Publikovat

Přírůstkově aktualizuje schéma databáze tak, aby odpovídalo schématu zdrojového souboru .dacpac. Pokud databáze na serveru neexistuje, operace publikování ji vytvoří. V opačném případě se aktualizuje existující databáze.

Syntaxe příkazu:

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

Příklad:

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

Pomoc:

sqlpackage.exe /Action:Publish /?

Export

Exportuje živou databázi, včetně schématu databáze a uživatelských dat, z SQL Serveru nebo Microsoft Azure SQL Database do balíčku BACPAC (soubor BACPAC).

Syntaxe příkazu:

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

Příklad:

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

Pomoc:

sqlpackage.exe /Action:Export /?

Import

Importuje data schématu a tabulky z balíčku BACPAC do nové uživatelské databáze v instanci SQL Serveru nebo Microsoft Azure SQL Database.

Syntaxe příkazu:

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

Příklad:

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

Pomoc:

sqlpackage.exe /Action:Import /?

DeployReport

Vytvoří sestavu XML změn, které by provedla akce publikování.

Syntaxe příkazu:

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

Příklad:

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" 

Pomoc:

sqlpackage.exe /Action:DeployReport /?

DriftReport

Vytvoří sestavu XML změn provedených v registrované databázi od poslední registrace.

Syntaxe příkazu:

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

Příklad:

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

Pomoc:

sqlpackage.exe /Action:DriftReport /?

Skript

Vytvoří skript přírůstkové aktualizace Jazyka Transact-SQL, který aktualizuje schéma cíle tak, aby odpovídalo schématu zdroje.

Syntaxe příkazu:

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

Příklad:

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"

Pomoc:

sqlpackage.exe /Action:Script /?