Azure SQL データベースのデプロイ

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

ビルドが成功するたびに、データベースの更新を Azure SQL データベースに自動的にデプロイできます。

DACPAC

データベースをデプロイする最も簡単な方法は、データ層パッケージまたは DACPAC を作成することです。 DACPAC を使用して、スキーマの変更とデータをパッケージ化して展開できます。 DACPAC は、Visual Studio の SQL データベース プロジェクトを使用して作成できます。

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 スクリプト

DACPAC を使用する代わりに、SQL スクリプトを使用してデータベースをデプロイすることもできます。 空のデータベースを作成する SQL スクリプトの簡単な例を次に示します。

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

パイプラインの一部として SQL スクリプトを実行するには、Azure でファイアウォール規則を作成および削除するための Azure PowerShell スクリプトが必要です。 ファイアウォール規則がないと、Azure Pipelines エージェントは Azure SQL Database と通信できません。

次の 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 でこれを実施するには、次の方法のいずれかを使用します。

  • デプロイ手順を別のジョブに分離し、そのジョブに条件を追加します。
  • 手順に条件を追加します。

次の例は、手順の条件を使用して、メイン ブランチから作成されたビルドのみをデプロイする方法を示しています。

- 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 がインストールされているフォルダーから実行する場合は、パスの前に & を付け、二重引用符で囲む必要があります。

基本構文

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

実行するアクションに応じて、次のいずれかの SQL スクリプトを使用できます

抽出

ライブ SQL Server または Microsoft Azure SQL Database からデータベース スナップショット (.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 /?

[エクスポート]

SQL Server または Microsoft Azure SQL Database から、データベース スキーマとユーザー データを含むライブ データベースを 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 /?

[インポート]

BACPAC パッケージのスキーマとテーブル データを、SQL Server または Microsoft. Azure SQL Database インスタンス内の新しいユーザー データベースにインポートします。

コマンド構文:

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