Aracılığıyla paylaş


Azure SQL veritabanı dağıtımı

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

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

DACPAC

Veritabanını dağıtmanın en basit yolu, veri katmanı paketi veya DACPAC oluşturmaktır. DACPAC'ler şema değişikliklerini ve verilerini paketlemek ve dağıtmak için kullanılabilir. Visual Studio'daki SQL veritabanı projesini kullanarak bir DACPAC oluşturabilirsiniz.

DaCPAC'yi bir Azure SQL veritabanına dağıtmak için aşağıdaki kod parçacığını azure-pipelines.yml dosyanıza 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>'

Ayrıca bkz. Azure SQL Veritabanı Dağıtım görevi kullanılırken kimlik doğrulama bilgileri.

SQL betikleri

VERITABANınızı dağıtmak için DACPAC kullanmak yerine SQL betiklerini de kullanabilirsiniz. Boş veritabanı oluşturan basit bir SQL betiği örneği aşağıda verilmiştır.

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

SQL betiklerini bir işlem hattının parçası olarak çalıştırmak için Azure'da güvenlik duvarı kuralları oluşturmak ve kaldırmak için Azure PowerShell betiklerine ihtiyacınız vardır. Güvenlik duvarı kuralları olmadan Azure Pipelines aracısı Azure SQL Veritabanı ile iletişim kuramaz.

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

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

Klasik

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

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

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

Klasik

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

SQL betiğini çalıştırmak için azure-pipelines.yml dosyanıza aşağıdakileri ekleyin.

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 hizmet bağlantısı

Azure SQL Veritabanı Dağıtımı görevi, veritabanını Azure'a dağıtmaya ilişkin 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'tan Azure'a bağlanmak için kimlik bilgilerini depolar.

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

Azure hizmet bağlantısı oluşturmayı öğrenmek için bkz . Azure hizmet bağlantısı oluşturma.

Koşullu olarak dağıtma

Azure veritabanınıza yalnızca belirli derlemeleri dağıtmayı seçebilirsiniz.

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

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

Aşağıdaki örnekte, yalnızca ana daldan kaynaklanan derlemeleri dağıtmak için adım koşullarının nasıl kullanılacağı gösterilmektedir.

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

Diğer SQL eylemleri

SQL Azure Dacpac Dağıtımı , gerçekleştirmek istediğiniz tüm SQL server eylemlerini desteklemeyebilir. Böyle durumlarda, ihtiyacınız olan komutları çalıştırmak için PowerShell veya komut satırı betiklerini kullanabilirsiniz. Bu bölümde, SqlPackage.exe aracını çağırmaya yönelik bazı yaygın kullanım örnekleri gösterilmektedir. Bu aracı çalıştırmanın önkoşulu olarak, şirket içinde barındırılan bir aracı kullanmanız ve aracını aracınızda yüklü olması gerekir.

Not

SQLPackage'ı yüklendiği klasörden yürütürseniz, yolu ön ekleyip & çift tırnak içine sarmalamanı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ı sql sunucusundan veya Microsoft Azure SQL Veritabanı 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.placeholder"
 /SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"

Yardım:

sqlpackage.exe /Action:Extract /?

Yayımlama

Bir veritabanı şemasını, kaynak .dacpac dosyasının şemasıyla eşleşecek şekilde artımlı olarak güncelleştirir. Veritabanı sunucuda yoksa yayımlama işlemi bunu oluşturur. Aksi takdirde, mevcut 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.placeholder"
/TargetDatabaseName:"Testdb4" /TargetUser:"ajay" /TargetPassword:"SQLPassword"

Yardım:

sqlpackage.exe /Action:Publish /?

Export

Veritabanı şeması ve kullanıcı verileri de dahil olmak üzere canlı veritabanını SQL Server'dan veya Microsoft Azure SQL Veritabanı bir 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.placeholder"
/SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"

Yardım:

sqlpackage.exe /Action:Export /?

İçeri Aktar

Şema ve tablo verilerini bir BACPAC paketinden 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.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword"

Yardım:

sqlpackage.exe /Action:Import /?

DeployReport

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

Komut Sözdizimi:

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.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\deployReport.xml" 

Yardım:

sqlpackage.exe /Action:DeployReport /?

DriftReport

En son kaydedildiğinden bu yana kayıtlı bir veritabanında yapılan değişikliklerin XML raporunu oluşturur.

Komut Sözdizimi:

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.placeholder" /TargetDatabaseName:"Testdb"
/TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\driftReport.xml"

Yardım:

sqlpackage.exe /Action:DriftReport /?

Komut Dosyası

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

Komut Sözdizimi:

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.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\test.sql"
/Variables:StagingDatabase="Staging DB Variable value"

Yardım:

sqlpackage.exe /Action:Script /?