Azure SQL veritabanı dağıtımı

Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 | TFS 2017

Not

Microsoft Team Foundation Server (TFS) 2018 ve önceki sürümlerde, derleme ve yayın işlem hatlarıtanımlarolarak adlandırılır, çalışmalaraderlemelerdenir, hizmet bağlantılarınahizmet uç noktalarıdenir, aşamalarortamlarolarak adlandırılır ve işleraşamalarolarak adlandırılır.

her başarılı derlemeden sonra, veritabanı güncelleştirmelerinizi Azure SQL veritabanına otomatik olarak dağıtabilirsiniz.

DACPAC

Bir veritabanını dağıtmanın en basit yolu, veri katmanı paketi veya DACPAColuşturmaktır. DACPACs, şema değişikliklerinin yanı sıra verileri de paketlemek ve dağıtmak için kullanılabilir. Visual Studio SQL veritabanı projesini kullanarak bir dacpac oluşturabilirsiniz.

bir Azure SQL veritabanına bir dacpac dağıtmak için, azure-pipelines. yıml dosyanıza aşağıdaki kod parçacığını ekleyin.

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

YAML işlem hatları TFS 'de kullanılamaz.

Azure SQL Veritabanı dağıtım görevini kullanırken ayrıca bkz. kimlik doğrulama bilgileri.

SQL betikleri

bir dacpac kullanmak yerine, veritabanınızı dağıtmak için SQL betikleri de kullanabilirsiniz. boş bir veritabanı oluşturan SQL betiğe ilişkin basit bir örnek aşağıda verilmiştir.

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

SQL betikleri bir işlem hattının parçası olarak çalıştırmak için azure Powershell betiklerinin azure 'da güvenlik duvarı kuralları oluşturup kaldırabilmeniz gerekir. güvenlik duvarı kuralları olmadan, Azure Pipelines aracısı Azure SQL Veritabanı iletişim kuramaz.

Aşağıdaki PowerShell betiği güvenlik duvarı kuralları oluşturur. Bu betiği deponuzda olarak iade edebilirsiniz SetAzureFirewallRule.ps1 .

ARM

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroup,
  [String] $AzureFirewallName = "AzureWebAppFirewall"
)
$agentIP = (New-Object net.webclient).downloadstring("https://api.ipify.org")
New-AzSqlServerFirewallRule -ResourceGroupName $ResourceGroup -ServerName $ServerName -FirewallRuleName $AzureFirewallName -StartIPAddress $agentIp -EndIPAddress $agentIP

Klasik

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroupName,
  [String] $AzureFirewallName = "AzureWebAppFirewall"
)

$ErrorActionPreference = 'Stop'

function New-AzureSQLServerFirewallRule {
  $agentIP = (New-Object net.webclient).downloadstring("https://api.ipify.org")
  New-AzureSqlDatabaseServerFirewallRule -StartIPAddress $agentIp -EndIPAddress $agentIp -FirewallRuleName $AzureFirewallName -ServerName $ServerName -ResourceGroupName $ResourceGroupName
}
function Update-AzureSQLServerFirewallRule{
  $agentIP= (New-Object net.webclient).downloadstring("https://api.ipify.org")
  Set-AzureSqlDatabaseServerFirewallRule -StartIPAddress $agentIp -EndIPAddress $agentIp -FirewallRuleName $AzureFirewallName -ServerName $ServerName -ResourceGroupName $ResourceGroupName
}

If ((Get-AzureSqlDatabaseServerFirewallRule -ServerName $ServerName -FirewallRuleName $AzureFirewallName -ResourceGroupName $ResourceGroupName -ErrorAction SilentlyContinue) -eq $null)
{
  New-AzureSQLServerFirewallRule
}
else
{
  Update-AzureSQLServerFirewallRule
}

Aşağıdaki PowerShell betiği güvenlik duvarı kurallarını kaldırır. Bu betiği deponuzda olarak iade edebilirsiniz RemoveAzureFirewall.ps1 .

ARM

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroup,
  [String] $AzureFirewallName = "AzureWebAppFirewall"
)
Remove-AzSqlServerFirewallRule -ServerName $ServerName -FirewallRuleName $AzureFirewallName -ResourceGroupName $ResourceGroup

Klasik

[CmdletBinding(DefaultParameterSetName = 'None')]
param
(
  [String] [Parameter(Mandatory = $true)] $ServerName,
  [String] [Parameter(Mandatory = $true)] $ResourceGroupName,
  [String] $AzureFirewallName = "AzureWebAppFirewall"
)

$ErrorActionPreference = 'Stop'

If ((Get-AzureSqlDatabaseServerFirewallRule -ServerName $ServerName -FirewallRuleName $AzureFirewallName -ResourceGroupName $ResourceGroupName -ErrorAction SilentlyContinue))
{
  Remove-AzureSqlDatabaseServerFirewallRule -FirewallRuleName $AzureFirewallName -ServerName $ServerName -ResourceGroupName $ResourceGroupName
}

bir SQL betiği çalıştırmak için aşağıdakini azure-pipelines. yıml dosyanıza ekleyin.

variables:
  AzureSubscription: '<Azure service connection>'
  ServerName: '<Database server name>'
  DatabaseName: '<Database name>'
  AdminUser: '<SQL user name>'
  AdminPassword: '<SQL user password>'
  SQLFile: '<Location of SQL file in $(Build.SourcesDirectory)>'

steps:
- task: AzurePowerShell@2
  displayName: Azure PowerShell script: FilePath
  inputs:
    azureSubscription: '$(AzureSubscription)'
    ScriptPath: '$(Build.SourcesDirectory)\scripts\SetAzureFirewallRule.ps1'
    ScriptArguments: '$(ServerName)'
    azurePowerShellVersion: LatestVersion

- task: CmdLine@1
  displayName: Run Sqlcmd
  inputs:
    filename: Sqlcmd
    arguments: '-S $(ServerName) -U $(AdminUser) -P $(AdminPassword) -d $(DatabaseName) -i $(SQLFile)'

- task: AzurePowerShell@2
  displayName: Azure PowerShell script: FilePath
  inputs:
    azureSubscription: '$(AzureSubscription)'
    ScriptPath: '$(Build.SourcesDirectory)\scripts\RemoveAzureFirewallRule.ps1'
    ScriptArguments: '$(ServerName)'
    azurePowerShellVersion: LatestVersion

YAML işlem hatları TFS 'de kullanılamaz.

Azure hizmet bağlantısı

Azure SQL Veritabanı dağıtım görevi, Azure 'da bir veritabanını dağıtmaya yönelik birincil mekanizmadır. Bu görev, diğer yerleşik Azure görevlerinde olduğu gibi, giriş olarak bir Azure hizmet bağlantısı gerektirir. azure hizmet bağlantısı, Azure Pipelines veya TFS 'den Azure 'a bağlanmak için kimlik bilgilerini depolar.

bu görevi kullanmaya başlamanın en kolay yolu, hem Azure DevOps kuruluşa hem de Azure aboneliğine sahip olan bir kullanıcı olarak oturum açmadır. Bu durumda, hizmet bağlantısını el ile oluşturmanız gerekmez. Aksi takdirde, Azure hizmet bağlantısı oluşturma hakkında bilgi edinmek için bkz. Azure hizmet bağlantısı oluşturma.

Azure hizmet bağlantısı oluşturma hakkında bilgi edinmek için bkz. Azure hizmet bağlantısı oluşturma.

Koşullu dağıtım

Azure veritabanınıza yalnızca belirli derlemeleri dağıtmayı tercih edebilirsiniz.

Bunu YAML 'de yapmak için şu tekniklerden birini kullanabilirsiniz:

  • Dağıtım adımlarını ayrı bir iş olarak yalıtın ve bu işe bir koşul ekleyin.
  • Adıma bir koşul ekleyin.

Aşağıdaki örnek, yalnızca ana daldan kaynaklanan derlemeleri dağıtmak için adım koşullarını nasıl kullanacağınızı gösterir.

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

Koşullar hakkında daha fazla bilgi edinmek için bkz. Koşulları belirtme.

YAML işlem hatları TFS 'de kullanılamaz.

ek SQL eylemleri

SQL Azure dacpac dağıtımı , gerçekleştirmek istediğiniz tüm SQL sunucu eylemlerini desteklemiyor olabilir. Bu gibi durumlarda, ihtiyacınız olan komutları çalıştırmak için PowerShell veya komut satırı komut dosyalarını kullanmanız yeterlidir. Bu bölümde SqlPackage.exe aracınıçağırmaya yönelik bazı yaygın kullanım durumları gösterilmektedir. Bu aracı çalıştırmanın bir önkoşulu olarak, kendi kendine barındırılan bir aracı kullanmanız ve aracının aracıda yüklü olması gerekir.

Not

SqlPackage 'i yüklendiği klasörden çalıştırırsanız, yolu ile Önekleyip çift tırnak içine almanız gerekir.

Temel söz dizimi

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

gerçekleştirmek istediğiniz eyleme bağlı olarak aşağıdaki SQL betiklerinden herhangi birini kullanabilirsiniz

Ayıkla

canlı bir SQL sunucusundan veya Microsoft Azure SQL Veritabanı bir veritabanı anlık görüntüsü (. dacpac) dosyası oluşturur.

Komut sözdizimi:

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

veya

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

Örnek:

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

Yardım:

sqlpackage.exe /Action:Extract /?

Yayımlama

Bir veritabanı şemasını bir kaynak. dacpac dosyasının şemasıyla eşleşecek şekilde artımlı olarak güncelleştirir. Veritabanı sunucuda yoksa, yayımlama işlemi onu oluşturacaktır. Aksi takdirde, var olan bir veritabanı güncelleştirilir.

Komut sözdizimi:

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

Örnek:

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

Yardım:

sqlpackage.exe /Action:Publish /?

Dışarı Aktarma

veritabanı şeması ve kullanıcı verileri de dahil olmak üzere canlı bir veritabanını SQL Server veya Microsoft Azure SQL Veritabanı bacpac paketine (. bacpac dosyası) aktarır.

Komut sözdizimi:

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

Örnek:

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

Yardım:

sqlpackage.exe /Action:Export /?

İçeri Aktar

bir bacpac paketinden şema ve tablo verilerini bir SQL Server veya Microsoft Azure SQL Veritabanı örneğindeki yeni bir kullanıcı veritabanına aktarır.

Komut sözdizimi:

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

Örnek:

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

Yardım:

sqlpackage.exe /Action:Import /?

DeployReport

Yayımlama eylemi tarafından yapılacak değişikliklerin BIR XML raporunu oluşturur.

Komut Söz Dizimi:

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

Örnek:

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" 

Yardım:

sqlpackage.exe /Action:DeployReport /?

DriftReport

Kayıtlı bir veritabanında yapılan değişikliklerin en son kaydedildiklerinin bir XML raporunu oluşturur.

Komut Söz Dizimi:

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

Örnek:

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

Yardım:

sqlpackage.exe /Action:DriftReport /?

Komut Dosyası

Hedefin şemasını bir SQL şemayla eş olacak şekilde güncelleştiren bir Transact-SQL artımlı güncelleştirme betiği oluşturur.

Komut Söz Dizimi:

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

Örnek:

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"

Yardım:

sqlpackage.exe /Action:Script /?