Distribuzione database SQL di Azure

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

Nota

In Microsoft Team Foundation Server (TFS) 2018 e versioni precedenti, le pipeline di compilazione e rilascio sono denominate definizioni, le esecuzioni sono denominate build,le connessioni al servizio sono denominate endpointdi servizio, le fasi sono denominate ambienti e i processi sono denominati fasi.

È possibile distribuire automaticamente gli aggiornamenti del database in Azure SQL database dopo ogni compilazione completata.

DACPAC

Il modo più semplice per distribuire un database è creare un pacchetto livello dati o DACPAC. I DACC possono essere usati per creare pacchetti e distribuire modifiche dello schema, nonché dati. È possibile creare un file DACPAC usando il SQL di database in Visual Studio.

Per distribuire un file DACPAC in un database SQL Azure, aggiungere il frammento di codice seguente al file azure-pipelines.yml.

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

Le pipeline YAML non sono disponibili in TFS.

Vedere anche le informazioni di autenticazione quando si usa l'database SQL di Azure di distribuzione .

Script SQL

Invece di usare un dacpac, è anche possibile usare SQL script per distribuire il database. Di seguito è riportato un semplice esempio di script SQL che crea un database vuoto.

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

Per eseguire SQL script come parte di una pipeline, sono necessari script di Azure PowerShell per creare e rimuovere regole del firewall in Azure. Senza le regole del firewall, l'Azure Pipelines non può comunicare con database SQL di Azure.

Lo script di PowerShell seguente crea regole del firewall. È possibile archiviare questo script SetAzureFirewallRule.ps1 come nel repository.

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

Classic

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

Lo script di PowerShell seguente rimuove le regole del firewall. È possibile archiviare questo script RemoveAzureFirewall.ps1 come nel repository.

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

Classic

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

Aggiungere quanto segue al file azure-pipelines.yml per eseguire SQL script.

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

Le pipeline YAML non sono disponibili in TFS.

Connessione al servizio di Azure

L database SQL di Azure di distribuzione è il meccanismo principale per distribuire un database in Azure. Questa attività, come per altre attività di Azure incorporate, richiede una connessione al servizio di Azure come input. La connessione al servizio Azure archivia le credenziali per la connessione da Azure Pipelines O TFS ad Azure.

Il modo più semplice per iniziare a usare questa attività è accedere come utente proprietario dell'organizzazione Azure DevOps e della sottoscrizione di Azure. In questo caso, non sarà necessario creare manualmente la connessione al servizio. In caso contrario, per informazioni su come creare una connessione al servizio di Azure, vedere Creare una connessione al servizio di Azure.

Per informazioni su come creare una connessione al servizio di Azure, vedere Creare una connessione al servizio di Azure.

Distribuzione condizionale

È possibile scegliere di distribuire solo determinate compilazioni nel database di Azure.

A tale scopo in YAML, è possibile usare una di queste tecniche:

  • Isolare i passaggi di distribuzione in un processo separato e aggiungere una condizione a tale processo.
  • Aggiungere una condizione al passaggio.

L'esempio seguente illustra come usare le condizioni del passaggio per distribuire solo le compilazioni che hanno origine dal ramo principale.

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

Per altre informazioni sulle condizioni, vedere Specificare le condizioni.

Le pipeline YAML non sono disponibili in TFS.

Azioni SQL aggiuntive

SQL Azure distribuzione Dacpac potrebbe non supportare tutte le SQL server da eseguire. In questi casi, è sufficiente usare PowerShell o script della riga di comando per eseguire i comandi necessari. Questa sezione illustra alcuni dei casi d'uso comuni per richiamare lo strumentoSqlPackage.exe . Come prerequisito per l'esecuzione di questo strumento, è necessario usare un agente self-hosted e installare lo strumento nell'agente.

Nota

Se si esegue SQLPackage dalla cartella in cui è installato, è necessario aggiungere il prefisso al percorso e racchiuderlo tra virgolette doppie.

Sintassi di base

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

È possibile usare uno degli script SQL seguenti a seconda dell'azione che si vuole eseguire

Estrazione

Crea un file snapshot del database (con estensione dacpac) da un server SQL live o da database SQL di Microsoft Azure.

Sintassi del comando:

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

oppure

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

Esempio:

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

Guida:

sqlpackage.exe /Action:Extract /?

Pubblica

aggiorna in modo incrementale uno schema di database affinché corrisponda allo schema di un file di origine con estensione dacpac. Se il database non esiste nel server, l'operazione Publish lo crea. In caso contrario, verrà aggiornato quello esistente.

Sintassi del comando:

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

Esempio:

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

Guida:

sqlpackage.exe /Action:Publish /?

Esportazione

Esporta un database live, inclusi lo schema del database e i dati utente, da SQL Server o database SQL di Microsoft Azure a un pacchetto BACPAC (file bacpac).

Sintassi del comando:

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

Esempio:

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

Guida:

sqlpackage.exe /Action:Export /?

Importa

Importa i dati dello schema e della tabella da un pacchetto BACPAC in un nuovo database utente in un'istanza di SQL Server o database SQL di Microsoft Azure.

Sintassi del comando:

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

Esempio:

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

Guida:

sqlpackage.exe /Action:Import /?

DeployReport

crea un report XML delle modifiche che verrebbero effettuate da un'azione Publish.

Sintassi del comando:

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

Esempio:

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" 

Guida:

sqlpackage.exe /Action:DeployReport /?

DriftReport

crea un report XML delle modifiche apportate a un database registrato dall'ultima registrazione.

Sintassi del comando:

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

Esempio:

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

Guida:

sqlpackage.exe /Action:DriftReport /?

Script

crea uno script di aggiornamento incrementale Transact-SQL che aggiorna lo schema di una destinazione affinché corrisponda allo schema di un'origine.

Sintassi del comando:

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

Esempio:

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"

Guida:

sqlpackage.exe /Action:Script /?