Bagikan melalui


Penyebaran basis data Azure SQL

Layanan Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

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

Prasyarat

Produk Persyaratan
Azure DevOps - Proyek Azure DevOps.
- Izin:
    - Untuk membuat koneksi layanan, Anda harus memiliki peran Administrator atau Creator untuk koneksi layanan .

DACPAC

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

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. Koneksi layanan Azure menyimpan kredensial untuk menyambung 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.

Untuk menyebarkan DACPAC ke database Azure SQL, gunakan tugas penyebaran Azure SQL Database. Tambahkan cuplikan berikut ke file YAML 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>'

Skrip SQL

Atau, Anda dapat menggunakan skrip SQL alih-alih DACPAC untuk menyebarkan database Anda. Di bawah ini adalah skrip SQL sederhana 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 dari alur, Anda harus menambahkan dan menghapus aturan firewall di Azure. Tanpa aturan ini, agen Azure Pipelines tidak dapat berkomunikasi dengan Azure SQL Database.

Mengatur aturan firewall Azure

Skrip PowerShell berikut membuat aturan firewall. Simpan sebagai SetAzureFirewallRule.ps1 dan tambahkan ke repositori Anda:

[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

Menghapus aturan firewall Azure

Skrip PowerShell berikut menghapus aturan firewall. Simpan sebagai RemoveAzureFirewallRule.ps1 dan tambahkan ke repositori Anda:

[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

Menyebarkan database dengan skrip SQL

Contoh berikut menguraikan langkah-langkah untuk menambahkan aturan firewall, menyebarkan database Anda menggunakan skrip SQL, lalu menghapus aturan 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

Menyebarkan database secara kondisional

Anda dapat memilih untuk menyebarkan hanya build tertentu ke database Azure Anda, memberi Anda kontrol lebih besar atas perubahan mana yang diterapkan berdasarkan kriteria seperti cabang sumber atau status build.

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

  • Pisahkan langkah-langkah penyebaran ke dalam tugas terpisah dan terapkan sebuah kondisi pada tugas tersebut.

  • Tambahkan kondisi langsung ke langkah tersebut.

Contoh di bawah ini menunjukkan cara menyebarkan hanya build dari cabang utama menggunakan kondisi:

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

Tindakan SQL lainnya

Tugas Penyebaran SQL Azure Dacpac mungkin tidak mencakup semua tindakan server SQL yang perlu Anda lakukan. Dalam kasus seperti itu, Anda dapat menggunakan PowerShell atau skrip baris perintah untuk menjalankan perintah yang diperlukan.

Bagian ini mencakup kasus penggunaan umum untuk memanggil alatSqlPackage.exe. Sebelum menjalankan alat ini, pastikan Anda menggunakan agen dengan hosting mandiri yang sudah terinstal alatnya.

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 berdasarkan tindakan yang ingin Anda lakukan:

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

atau

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