Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Wdrażanie bazy danych Azure SQL

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

Aktualizacje bazy danych można wdrożyć automatycznie w bazie danych Azure SQL Database po każdej pomyślnej kompilacji.

Wymagania wstępne

produkt Wymagania
Azure DevOps projekt usługi Azure DevOps.
Uprawnienia: -
    — Aby utworzyć połączenia usług, musisz mieć rolę administratora lub twórcy dla połączeń usług.

DACPAC

Najprostszym sposobem wdrożenia bazy danych jest użycie pakietu warstwy danych lub pakietu DACPAC. DACPACs umożliwiają pakowanie i wdrażanie zmian schematu i danych. Możesz utworzyć pakiet DACPAC przy użyciu Projektu bazy danych SQL w programie Visual Studio.

Zadanie wdrażania usługi Azure SQL Database jest podstawowym mechanizmem wdrażania bazy danych na platformie Azure. To zadanie, podobnie jak w przypadku innych wbudowanych zadań platformy Azure, wymaga połączenia z usługą platformy Azure jako danych wejściowych. Połączenie usługi Azure przechowuje poświadczenia do łączenia Azure Pipelines z platformą Azure.

Najprostszym sposobem rozpoczęcia pracy z tym zadaniem jest zalogowanie się jako użytkownik, który jest właścicielem zarówno organizacji usługi Azure DevOps, jak i subskrypcji platformy Azure. W takim przypadku nie trzeba ręcznie tworzyć połączenia usługi. W przeciwnym razie, aby dowiedzieć się, jak utworzyć połączenie z usługą platformy Azure, zobacz Tworzenie połączenia z usługą platformy Azure.

Aby dowiedzieć się, jak utworzyć połączenie z usługą platformy Azure, zobacz Tworzenie połączenia z usługą platformy Azure.

Aby wdrożyć pakiet DACPAC w bazie danych Azure SQL Database, użyj zadania wdrażania usługi Azure SQL Database. Dodaj następujący fragment kodu do pliku 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>'

Skrypty SQL

Alternatywnie możesz użyć skryptów SQL zamiast pakietu DACPAC do wdrożenia bazy danych. Poniżej znajduje się prosty skrypt SQL, który tworzy pustą bazę danych:

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

Aby uruchomić skrypty SQL z Twojego potoku, należy dodać i usunąć reguły zapory z platformy Azure. Bez tych reguł agent usługi Azure Pipelines nie może komunikować się z usługą Azure SQL Database.

Ustawianie reguł zapory platformy Azure

Poniższy skrypt programu PowerShell tworzy reguły zapory sieciowej. Zapisz go jako SetAzureFirewallRule.ps1 i dodaj go do repozytorium:

[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

Usuwanie reguł zapory platformy Azure

Poniższy skrypt programu PowerShell usuwa reguły zapory. Zapisz go jako RemoveAzureFirewallRule.ps1 i dodaj go do repozytorium:

[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

Wdrażanie bazy danych za pomocą skryptów SQL

W poniższym przykładzie przedstawiono kroki dodawania reguł zapory, wdrażania bazy danych przy użyciu skryptów SQL, a następnie usuwania reguł zapory:

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
  inputs:
  displayName: 'Install SqlServer module if not present'
    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

Warunkowe wdrażanie bazy danych

Możesz zdecydować się na wdrożenie tylko określonych kompilacji w bazie danych platformy Azure, co zapewnia większą kontrolę nad tym, które zmiany są stosowane na podstawie kryteriów, takich jak gałąź źródłowa lub stan kompilacji.

Aby to zrobić w języku YAML, możesz użyć jednej z następujących technik:

  • Izoluj kroki wdrażania do oddzielnego zadania i zastosuj warunek do tego zadania.

  • Dodaj warunek bezpośrednio do kroku.

W poniższym przykładzie pokazano, jak wdrażać tylko kompilacje z gałęzi głównej przy użyciu warunków:

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

Więcej akcji SQL

Zadanie wdrażania usługi SQL Azure Dacpac może nie obejmować wszystkich akcji serwera SQL, które należy wykonać. W takich przypadkach można użyć programu PowerShell lub skryptów wiersza polecenia, aby wykonać wymagane polecenia.

W tej sekcji opisano typowe przypadki użycia wywoływania narzędziaSqlPackage.exe. Przed uruchomieniem tego narzędzia upewnij się, że używasz własnego agenta z zainstalowanym narzędziem.

Uwaga

Jeśli uruchamiasz SQLPackage z folderu, w którym jest zainstalowany, musisz poprzedzić ścieżkę prefiksem & i ująć ją w podwójne cudzysłowy.

Podstawowa składnia

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

Możesz użyć dowolnego z następujących skryptów SQL na podstawie akcji, którą chcesz wykonać:

Tworzy plik migawki bazy danych (dacpac) z działającego serwera SQL lub bazy danych Microsoft Azure SQL.

Składnia polecenia:

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

lub

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

Przykład:

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

Pomoc:

sqlpackage.exe /Action:Extract /?

Dodatkowe zasoby