다음을 통해 공유


Azure SQL Database 배포

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

빌드가 성공할 때마다 Azure SQL 데이터베이스에 데이터베이스 업데이트를 자동으로 배포할 수 있습니다.

DACPAC

데이터베이스를 배포하는 가장 간단한 방법은 데이터 계층 패키지 또는 DACPAC를 만드는 것입니다. DACPAC를 사용하여 스키마 변경 내용 및 데이터를 패키지하고 배포할 수 있습니다. Visual Studio에서 SQL 데이터베이스 프로젝트를 사용하여 DACPAC를 만들 수 있습니다.

Azure SQL 데이터베이스에 DACPAC를 배포하려면 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 Database 배포 작업을 사용하는 경우 인증 정보도 참조하세요.

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

Azure 서비스 연결

Azure SQL Database 배포 작업은 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가 설치된 폴더에서 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.placeholder"
 /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.placeholder"
/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.placeholder"
/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.placeholder"
/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.placeholder"
/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.placeholder" /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.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\test.sql"
/Variables:StagingDatabase="Staging DB Variable value"

도움말:

sqlpackage.exe /Action:Script /?