Delen via


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

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

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

Vereiste voorwaarden

Product vereisten
Azure DevOps - Een Azure DevOps-project.
- Toestemmingen:
    - Als u serviceverbindingen wilt maken, moet u de Administrator-- of Creator- rol hebben voor serviceverbindingen.

DACPAC

De eenvoudigste manier om een database te implementeren, is met behulp van een gegevenslaagpakket of DACPAC. MET DACPACs kunt u schemawijzigingen en -gegevens verpakken en implementeren. U kunt een DACPAC maken met behulp van het SQL Database-project in Visual Studio.

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.

Zie Een Azure-serviceverbinding maken voor meer informatie over het maken van een Azure-serviceverbinding.

Als u een DACPAC wilt implementeren in een Azure SQL-database, gebruikt u de azure SQL Database-implementatietaak. Voeg het volgende fragment toe aan uw YAML-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>'

SQL-scripts

U kunt ook SQL-scripts gebruiken in plaats van DACPAC om uw database te implementeren. Hieronder ziet u een eenvoudig 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 vanuit uw pijplijn wilt uitvoeren, moet u firewallregels toevoegen en verwijderen in Azure. Zonder deze regels kan de Azure Pipelines-agent niet communiceren met Azure SQL Database.

Azure-firewallregels instellen

Met het volgende PowerShell-script worden firewallregels gemaakt. Sla deze op als SetAzureFirewallRule.ps1 en voeg deze toe aan uw opslagplaats:

[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

Azure-firewallregels verwijderen

Met het volgende PowerShell-script worden firewallregels verwijderd. Sla deze op als RemoveAzureFirewallRule.ps1 en voeg deze toe aan uw opslagplaats:

[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

Database implementeren met SQL-scripts

In het volgende voorbeeld worden de stappen beschreven voor het toevoegen van firewallregels, het implementeren van uw database met behulp van SQL-scripts en het verwijderen van de firewallregels:

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

Database voorwaardelijk implementeren

U kunt ervoor kiezen om alleen specifieke builds in uw Azure-database te implementeren, zodat u meer controle hebt over welke wijzigingen worden toegepast op basis van criteria zoals de bronbranch of de buildstatus.

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

  • Isoleer de implementatiestappen in een afzonderlijke taak en pas een voorwaarde toe op die taak.

  • Voeg rechtstreeks een voorwaarde toe aan de stap.

In het onderstaande voorbeeld ziet u hoe u alleen builds implementeert vanuit de hoofdbranch met behulp van voorwaarden:

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

Meer SQL-acties

De SQL Azure Dacpac-implementatietaak omvat mogelijk niet alle SQL-serveracties die u moet uitvoeren. In dergelijke gevallen kunt u PowerShell- of opdrachtregelscripts gebruiken om de vereiste opdrachten uit te voeren.

In deze sectie worden veelvoorkomende use cases beschreven voor het aanroepen van het hulpprogrammaSqlPackage.exe. Voordat u dit hulpprogramma uitvoert, moet u ervoor zorgen dat u een zelf-hostende agent gebruikt waarop het hulpprogramma is geïnstalleerd.

Notitie

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

Basissyntaxis

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

U kunt een van de volgende SQL-scripts gebruiken op basis van de actie die u wilt uitvoeren:

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

of

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

Hulp:

sqlpackage.exe /Action:Extract /?