Condividi tramite


Distribuzione database SQL di Azure

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

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

Prerequisiti

Prodotto Requisiti
Azure DevOps - Un progetto Azure DevOps.
Autorizzazioni - :
    - Per creare connessioni al servizio, è necessario avere il ruolo di amministratore o creatore per le connessioni al servizio .

DACPAC

Il modo più semplice per distribuire un database consiste nell'usare un pacchetto livello dati o un pacchetto daCPAC. DACPACs consente di creare un pacchetto e distribuire modifiche e dati dello schema. È possibile creare un pacchetto DACPAC usando il progetto di database SQL in Visual Studio.

L'attività di distribuzione del database SQL di Azure è il meccanismo principale per distribuire un database in Azure. Questa attività, come con altre attività di Azure predefinite, richiede una connessione al servizio di Azure come input. La connessione al servizio di Azure archivia le credenziali per connettersi da Azure Pipelines ad Azure.

Il modo più semplice per iniziare a usare questa attività consiste nell'accedere come utente proprietario sia dell'organizzazione Di Azure DevOps che 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.

Per distribuire un DACPAC in un database SQL di Azure, usare l'attività di distribuzione del database SQL di Azure. Aggiungere il frammento di codice seguente al file YAML:

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

Script SQL

In alternativa, è possibile usare script SQL anziché DACPAC per distribuire il database. Di seguito è riportato uno script SQL semplice 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 script SQL dalla pipeline, è necessario aggiungere e rimuovere regole del firewall in Azure. Senza queste regole, l'agente di Azure Pipelines non può comunicare con il database SQL di Azure.

Impostare le regole del firewall di Azure

Lo script di PowerShell seguente crea regole del firewall. Salvarlo con SetAzureFirewallRule.ps1 nome e aggiungerlo al repository:

[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

Rimuovere le regole del firewall di Azure

Lo script di PowerShell seguente rimuove le regole del firewall. Salvarlo con RemoveAzureFirewallRule.ps1 nome e aggiungerlo al repository:

[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

Distribuire il database con script SQL

L'esempio seguente illustra i passaggi per aggiungere regole del firewall, distribuire il database usando script SQL e quindi rimuovere le regole del firewall:

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: 'Set Azure firewall rules'
  inputs:
    azureSubscription: '$(AzureSubscription)'
    ScriptType: filePath
    ScriptPath: '$(Build.SourcesDirectory)\scripts\SetAzureFirewallRule.ps1'
    ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
    azurePowerShellVersion: LatestVersion

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

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

- task: AzurePowerShell@5
  displayName: 'Remove Azure firewall rules'
  inputs:
    azureSubscription: '$(AzureSubscription)'
    ScriptType: filePath
    ScriptPath: '$(Build.SourcesDirectory)\scripts\RemoveAzureFirewallRule.ps1'
    ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
    azurePowerShellVersion: LatestVersion

Distribuire il database in modo condizionale

È possibile scegliere di distribuire solo build specifiche nel database di Azure, offrendo maggiore controllo sulle modifiche applicate in base a criteri come il ramo di origine o lo stato della compilazione.

Per eseguire questa operazione in YAML, è possibile usare una di queste tecniche:

  • Isolare i passaggi di distribuzione in un processo separato e applicare una condizione a tale processo.

  • Aggiungi una condizione direttamente al passaggio.

L'esempio seguente illustra come distribuire solo le compilazioni dal ramo principale usando condizioni:

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

Altre azioni SQL

L'attività Dicpac Deployment di SQL Azure potrebbe non coprire tutte le azioni di SQL Server da eseguire. In questi casi, è possibile usare PowerShell o script della riga di comando per eseguire i comandi necessari.

Questa sezione illustra i casi d'uso comuni per richiamare lo strumento diSqlPackage.exe. Prima di eseguire questo strumento, assicurarsi che si stia utilizzando un agente self-hosted con lo strumento installato.

Nota

Se si esegue SQLPackage dalla cartella in cui è installato, devi anteporre '&' 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 in base all'azione da eseguire:

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

Sintassi dei comandi:

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

o

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.placeholder"
 /SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"

Aiuto:

sqlpackage.exe /Action:Extract /?