Bagikan melalui


Azure SQL database deployment

Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

Anda dapat secara otomatis menyebarkan pembaruan database Anda ke database Azure SQL setelah setiap build yang berhasil.

DACPAC

Cara paling sederhana untuk menyebarkan database adalah dengan membuat paket tingkat data atau DACPAC. DACPAC dapat digunakan untuk mengemas dan menyebarkan perubahan dan data skema. Anda dapat membuat DACPAC menggunakan proyek database SQL di Visual Studio.

Untuk menyebarkan DACPAC ke database Azure SQL, tambahkan cuplikan berikut ke file azure-pipelines.yml Anda.

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

Lihat juga informasi autentikasi saat menggunakan tugas Penyebaran Azure SQL Database.

Skrip SQL

Alih-alih menggunakan DACPAC, Anda juga dapat menggunakan skrip SQL untuk menyebarkan database Anda. Berikut adalah contoh sederhana skrip SQL yang membuat database kosong.

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

Untuk menjalankan skrip SQL sebagai bagian dari alur, Anda memerlukan skrip Azure PowerShell untuk membuat dan menghapus aturan firewall di Azure. Tanpa aturan firewall, agen Azure Pipelines tidak dapat berkomunikasi dengan Azure SQL Database.

Skrip PowerShell berikut membuat aturan firewall. Anda dapat memeriksa skrip ini seperti SetAzureFirewallRule.ps1 ke repositori Anda.

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

Klasik

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

Skrip PowerShell berikut menghapus aturan firewall. Anda dapat memeriksa skrip ini seperti RemoveAzureFirewallRule.ps1 ke repositori Anda.

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

Klasik

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

Tambahkan yang berikut ini ke file azure-pipelines.yml Anda untuk menjalankan skrip 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: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      if (-not (Get-Module -ListAvailable -Name SqlServer)) {
          Install-Module -Name SqlServer -Force -AllowClobber
      }
  displayName: 'Install SqlServer module if not present'

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

- 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

Koneksi layanan Azure

Tugas Penyebaran Azure SQL Database adalah mekanisme utama untuk menyebarkan database ke Azure. Tugas ini, seperti halnya tugas Azure bawaan lainnya, memerlukan koneksi layanan Azure sebagai input. Sambungan layanan Azure menyimpan informasi masuk untuk menyambungkan dari Azure Pipelines ke Azure.

Cara term mudah untuk memulai tugas ini adalah dengan masuk sebagai pengguna yang memiliki organisasi Azure DevOps dan langganan Azure. Dalam hal ini, Anda tidak perlu membuat sambungan layanan secara manual. Jika tidak, untuk mempelajari cara membuat sambungan layanan Azure, lihat Membuat sambungan layanan Azure.

Untuk mempelajari cara membuat koneksi layanan Azure, lihat Membuat koneksi layanan Azure.

Menyebarkan secara kondisional

Anda dapat memilih untuk hanya menyebarkan build tertentu ke database Azure Anda.

Untuk melakukan tindakan ini di YAML, Anda dapat menggunakan salah satu teknik berikut:

  • Isolasi langkah-langkah penyebaran ke dalam pekerjaan terpisah, dan tambahkan kondisi ke pekerjaan tersebut.
  • Tambahkan kondisi ke langkah tersebut.

Contoh berikut menunjukkan cara menggunakan kondisi langkah untuk menyebarkan hanya build yang berasal dari cabang utama.

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

Untuk mempelajari kondisi lebih lanjut, lihat Menentukan kondisi.

Tindakan SQL lainnya

Penyebaran SQL Azure Dacpac mungkin tidak mendukung semua tindakan server SQL yang ingin Anda lakukan. Dalam kasus ini, Anda cukup menggunakan PowerShell atau skrip baris perintah untuk menjalankan perintah yang Anda butuhkan. Bagian ini menunjukkan beberapa kasus penggunaan umum untuk memanggil alat SqlPackage.exe. Sebagai prasyarat untuk menjalankan alat ini, Anda harus menggunakan agen yang dihost sendiri dan menginstal alat pada agen Anda.

Catatan

Jika Anda menjalankan SQLPackage dari folder tempatnya diinstal, Anda harus mengawali jalur dengan & dan membungkusnya dalam tanda kutip ganda.

Sintaks dasar

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

Anda dapat menggunakan salah satu skrip SQL berikut tergantung pada tindakan yang ingin Anda lakukan

Ekstrak

Membuat file rekam jepret database (.dacpac) dari server SQL langsung atau Microsoft Azure SQL Database.

Sintaks Perintah:

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

or

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

Contoh:

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

Bantuan:

sqlpackage.exe /Action:Extract /?

Terbitkan

Memperbarui skema database secara bertahap agar sesuai dengan skema file .dacpac sumber. Jika database tidak ada di server, operasi penerbitan akan membuatnya. Jika tidak, database yang ada akan diperbarui.

Sintaks Perintah:

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

Contoh:

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

Bantuan:

sqlpackage.exe /Action:Publish /?

Ekspor

Mengekspor database langsung, termasuk skema database dan data pengguna, dari SQL Server atau Microsoft Azure SQL Database ke paket BACPAC (file.bacpac).

Sintaks Perintah:

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

Contoh:

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

Bantuan:

sqlpackage.exe /Action:Export /?

Impor

Mengimpor data skema dan tabel dari paket BACPAC ke database pengguna baru dalam instans SQL Server atau Microsoft Azure SQL Database.

Sintaks Perintah:

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

Contoh:

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

Bantuan:

sqlpackage.exe /Action:Import /?

DeployReport

Membuat laporan XML perubahan yang akan dibuat oleh tindakan terbitkan.

Sintaks Perintah:

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

Contoh:

SqlPackage.exe /SourceFile:"E: \dacpac\ajyadb.dacpac" /Action:DeployReport /TargetServerName:"DemoSqlServer.database.windows.net.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\deployReport.xml" 

Bantuan:

sqlpackage.exe /Action:DeployReport /?

DriftReport

Membuat laporan XML dari perubahan yang telah dibuat ke database terdaftar sejak terakhir didaftarkan.

Sintaks Perintah:

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

Contoh:

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

Bantuan:

sqlpackage.exe /Action:DriftReport /?

Skrip

Membuat skrip pembaruan inkremental Transact-SQL yang memperbarui skema target agar sesuai dengan skema sumber.

Sintaks Perintah:

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

Contoh:

SqlPackage.exe /Action:Script /SourceFile:"E:\dacpac\ajyadb.dacpac" /TargetServerName:"DemoSqlServer.database.windows.net.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\test.sql"
/Variables:StagingDatabase="Staging DB Variable value"

Bantuan:

sqlpackage.exe /Action:Script /?