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.

Pakiet DACPAC

Najprostszym sposobem wdrożenia bazy danych jest utworzenie pakietu warstwy danych lub pakietu DACPAC. DACPACs może służyć do tworzenia pakietów i wdrażania zmian schematu i danych. Pakiet DACPAC można utworzyć przy użyciu projektu bazy danych SQL w programie Visual Studio.

Aby wdrożyć pakiet DACPAC w bazie danych Azure SQL Database, dodaj następujący fragment kodu do pliku 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>'

Zobacz również informacje o uwierzytelnianiu podczas korzystania z zadania wdrażania usługi Azure SQL Database.

Skrypty SQL

Zamiast używać pakietu DACPAC, możesz również użyć skryptów SQL do wdrożenia bazy danych. Oto prosty przykład skryptu 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 w ramach potoku, należy utworzyć i usunąć reguły zapory na platformie Azure za pomocą skryptów programu Azure PowerShell. Bez reguł zapory agent usługi Azure Pipelines nie może komunikować się z usługą Azure SQL Database.

Poniższy skrypt programu PowerShell tworzy reguły zapory. Możesz zaewidencjonować ten skrypt w SetAzureFirewallRule.ps1 repozytorium.

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

Klasyczny

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

Poniższy skrypt programu PowerShell usuwa reguły zapory. Możesz zaewidencjonować ten skrypt w RemoveAzureFirewallRule.ps1 repozytorium.

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

Klasyczny

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

Dodaj następujący kod do pliku azure-pipelines.yml, aby uruchomić skrypt 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

Połączenie z usługą platformy Azure

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 z usługą platformy Azure przechowuje poświadczenia do nawiązania połączenia z usługi 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.

Wdrażanie warunkowe

Możesz zdecydować się na wdrożenie tylko niektórych kompilacji w bazie danych platformy Azure.

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 dodaj warunek do tego zadania.
  • Dodaj warunek do kroku.

W poniższym przykładzie pokazano, jak za pomocą warunków kroku wdrożyć tylko te kompilacje pochodzące z gałęzi głównej.

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

Aby dowiedzieć się więcej na temat warunków, zobacz Określanie warunków.

Więcej akcji SQL

Usługi SQL Azure wdrożenie Dacpac może nie obsługiwać wszystkich akcji programu SQL Server, które chcesz wykonać. W takich przypadkach możesz po prostu użyć programu PowerShell lub skryptów wiersza polecenia, aby uruchomić potrzebne polecenia. W tej sekcji przedstawiono niektóre typowe przypadki użycia podczas wywoływania narzędzia SqlPackage.exe. W ramach wymagań wstępnych dotyczących uruchamiania tego narzędzia należy użyć własnego agenta i zainstalować narzędzie na agencie.

Uwaga

Jeśli wykonujesz pakiet SQLPackage z folderu, w którym jest zainstalowany, musisz prefiksować ścieżkę za pomocą & polecenia i opakowować ją w cudzysłowy.

Podstawowa składnia

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

W zależności od akcji, którą chcesz wykonać, możesz użyć dowolnego z poniższych skryptów SQL

Wyodrębnianie

Tworzy plik migawki bazy danych (dacpac) z serwera SQL na żywo lub bazy danych Microsoft Azure SQL Database.

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

Pomoc:

sqlpackage.exe /Action:Extract /?

Publikowanie

Przyrostowo aktualizuje schemat bazy danych, aby był zgodny ze schematem źródłowego pliku dacpac. Jeśli baza danych nie istnieje na serwerze, operacja publikowania go utworzy. W przeciwnym razie istniejąca baza danych zostanie zaktualizowana.

Składnia polecenia:

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

Przykład:

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

Eksportuje dynamiczną bazę danych, w tym schemat bazy danych i dane użytkownika, z programu SQL Server lub usługi Microsoft Azure SQL Database do pakietu BACPAC (plik bacpac).

Składnia polecenia:

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

Przykład:

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 /?

Importuj

Importuje dane schematu i tabeli z pakietu BACPAC do nowej bazy danych użytkownika w wystąpieniu programu SQL Server lub usługi Microsoft Azure SQL Database.

Składnia polecenia:

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

Przykład:

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 /?

Wdrażanieraportu

Tworzy raport XML zmian, które zostaną wprowadzone przez akcję publikowania.

Składnia polecenia:

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

Przykład:

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

Tworzy raport XML zmian wprowadzonych w zarejestrowanej bazie danych od czasu jego ostatniej rejestracji.

Składnia polecenia:

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

Przykład:

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 /?

Skrypt

Tworzy skrypt aktualizacji przyrostowej języka Transact-SQL, który aktualizuje schemat obiektu docelowego w celu dopasowania do schematu źródła.

Składnia polecenia:

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

Przykład:

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 /?