Azure SQL 資料庫部署

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

您可以在每次成功建置之後,自動將資料庫更新部署至 Azure SQL 資料庫。

DACPAC

部署資料庫最簡單的方式是建立 數據層套件或 DACPAC。 DACPAC 可用來封裝和部署架構變更和數據。 您可以使用 Visual Studio 中的 SQL 資料庫專案來建立 DACPAC

若要將 DACPAC 部署至 Azure SQL 資料庫,請將下列代碼段新增至您的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>'

請參閱使用 Azure SQL 資料庫 部署工作時的驗證資訊。

SQL 指令碼

您也可以使用 SQL 腳本來部署資料庫,而不是使用 DACPAC。 以下是建立空白資料庫的 SQL 腳本簡單範例。

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

若要在管線中執行 SQL 腳本,您需要 Azure PowerShell 腳本,才能在 Azure 中建立和移除防火牆規則。 如果沒有防火牆規則,Azure Pipelines 代理程式就無法與 Azure SQL 資料庫 通訊。

下列 PowerShell 腳本會建立防火牆規則。 您可以將此文稿 SetAzureFirewallRule.ps1 簽入存放庫。

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

傳統

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

下列 PowerShell 腳本會移除防火牆規則。 您可以將此文稿 RemoveAzureFirewallRule.ps1 簽入存放庫。

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

傳統

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

將下列內容新增至您的azure-pipelines.yml檔案,以執行 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

Azure 服務連線

Azure SQL 資料庫 部署工作是將資料庫部署至 Azure 的主要機制。 此工作與其他內建 Azure 工作一樣,需要 Azure 服務連線做為輸入。 Azure 服務聯機會儲存認證,以從 Azure Pipelines 連線到 Azure。

若要開始使用這項工作,最簡單的方式是以擁有 Azure DevOps 組織和 Azure 訂用帳戶的使用者身分登入。 在此情況下,您不需要手動建立服務連線。 否則,若要瞭解如何建立 Azure 服務連線,請參閱 建立 Azure 服務連線

若要瞭解如何建立 Azure 服務連線,請參閱 建立 Azure 服務連線

有條件地部署

您可以選擇只將特定組建部署到您的 Azure 資料庫。

若要在 YAML 中這樣做,您可以使用下列其中一種技術:

  • 將部署步驟隔離至個別的作業,並將條件新增至該作業。
  • 將條件新增至步驟。

下列範例示範如何使用步驟條件,只部署源自 main 分支的組建。

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

如需深入了解其他條件,請參閱指定條件

更多 SQL 動作

SQL Azure Dacpac 部署 可能不支援您想要執行的所有 SQL Server 動作。 在這些情況下,您可以直接使用PowerShell或命令行腳本來執行所需的命令。 本節說明叫用SqlPackage.exe工具的一些常見使用案例。 若要執行此工具,您必須使用自我裝載代理程式,並在代理程式上安裝此工具。

注意

如果您從安裝 SQLPackage 的資料夾執行 SQLPackage ,您必須在路徑 & 前面加上 ,並以雙引號括住它。

基本語法

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

視您想要執行的動作而定,您可以使用下列任何一個 SQL 腳本

擷取

從即時 SQL 伺服器或 Microsoft Azure SQL 資料庫 建立資料庫快照集 (.dacpac) 檔案。

命令語法:

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

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

範例:

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

說明

sqlpackage.exe /Action:Extract /?

發行

以累加方式更新資料庫架構,以符合來源 .dacpac 檔案的架構。 如果伺服器上沒有資料庫,發行作業將會建立它。 否則,將會更新現有的資料庫。

命令語法:

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

範例:

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

說明

sqlpackage.exe /Action:Publish /?

Export

將實時資料庫,包括資料庫架構和用戶數據,從 SQL Server 或 Microsoft Azure SQL 資料庫 匯出至 BACPAC 套件 (.bacpac 檔案)。

命令語法:

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

範例:

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

說明

sqlpackage.exe /Action:Export /?

Import

將架構和數據表數據從 BACPAC 封裝匯入 SQL Server 實例或 Microsoft Azure SQL 資料庫 的新用戶資料庫。

命令語法:

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

範例:

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

說明

sqlpackage.exe /Action:Import /?

DeployReport

建立發行動作所做變更的 XML 報表。

命令語法:

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

範例:

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" 

說明

sqlpackage.exe /Action:DeployReport /?

DriftReport

建立自上次註冊后,已對已註冊之資料庫所做的變更的 XML 報表。

命令語法:

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

範例:

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

說明

sqlpackage.exe /Action:DriftReport /?

指令碼

建立 Transact-SQL 累加式更新腳本,以更新目標的架構以符合來源的架構。

命令語法:

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

範例:

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"

說明

sqlpackage.exe /Action:Script /?