Az Azure SQL Database üzembe helyezése

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

Minden sikeres build után automatikusan üzembe helyezheti az adatbázis-frissítéseket az Azure SQL Database-ben.

DACPAC

Az adatbázisok üzembe helyezésének legegyszerűbb módja az adatréteg-csomag vagy a DACPAC létrehozása. A DACPAC-k sémamódosítások és adatok csomagolására és üzembe helyezésére használhatók. DACPAC-t a Visual Studióban található SQL Database-projekt használatával hozhat létre.

Ha DACPAC-t szeretne üzembe helyezni egy Azure SQL-adatbázisban, adja hozzá a következő kódrészletet a azure-pipelines.yml fájlhoz.

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

Az Azure SQL Database üzembe helyezési feladatának használatakor lásd még a hitelesítési információkat.

SQL-szkriptek

DACPAC használata helyett SQL-szkriptekkel is üzembe helyezheti az adatbázist. Íme egy egyszerű példa egy üres adatbázist létrehozó SQL-szkriptre.

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

Ha SQL-szkripteket szeretne futtatni egy folyamat részeként, azure PowerShell-szkriptekre lesz szüksége ahhoz, hogy tűzfalszabályokat hozzon létre és távolítson el az Azure-ban. A tűzfalszabályok nélkül az Azure Pipelines-ügynök nem tud kommunikálni az Azure SQL Database-vel.

Az alábbi PowerShell-szkript tűzfalszabályokat hoz létre. Ezt a szkriptet ugyanúgy ellenőrizheti, mint SetAzureFirewallRule.ps1 az adattárban.

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

Klasszikus

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

Az alábbi PowerShell-szkript eltávolítja a tűzfalszabályokat. Ezt a szkriptet ugyanúgy ellenőrizheti, mint RemoveAzureFirewallRule.ps1 az adattárban.

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

Klasszikus

[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-szkript futtatásához adja hozzá a következőket a azure-pipelines.yml fájlhoz.

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-szolgáltatáskapcsolat

Az Azure SQL Database üzembe helyezési feladata az adatbázis Azure-ban történő üzembe helyezésének elsődleges mechanizmusa. Ehhez a feladathoz, mint más beépített Azure-feladatokhoz, egy Azure-szolgáltatáskapcsolatra van szükség bemenetként. Az Azure-szolgáltatáskapcsolat tárolja az Azure Pipelinesból az Azure-ba való csatlakozáshoz szükséges hitelesítő adatokat.

Ennek a feladatnak a legegyszerűbb módja, ha olyan felhasználóként jelentkezik be, aki az Azure DevOps-szervezetet és az Azure-előfizetést is birtokolja. Ebben az esetben nem kell manuálisan létrehoznia a szolgáltatáskapcsolatot. Ha szeretné megtudni, hogyan hozhat létre Azure-szolgáltatáskapcsolatot, olvassa el az Azure-szolgáltatáskapcsolatok létrehozását ismertető témakört.

Az Azure-szolgáltatáskapcsolatok létrehozásáról további információt az Azure-szolgáltatáskapcsolat létrehozása című témakörben talál.

Feltételes üzembe helyezés

Dönthet úgy, hogy csak bizonyos buildeket helyez üzembe az Azure-adatbázisban.

Ehhez a YAML-ben az alábbi technikák egyikét használhatja:

  • Elkülönítheti az üzembe helyezés lépéseit egy külön feladatba, és hozzáadhat egy feltételt ehhez a feladathoz.
  • Adjon hozzá egy feltételt a lépéshez.

Az alábbi példa bemutatja, hogyan lehet lépésfeltételeket használni csak a főágból származó buildek üzembe helyezéséhez.

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

A feltételekről további információt a Feltételek megadása című témakörben talál.

További SQL-műveletek

Előfordulhat, hogy az SQL Azure Dacpac üzembe helyezése nem támogatja az összes végrehajtani kívánt SQL Server-műveletet. Ezekben az esetekben egyszerűen PowerShell-lel vagy parancssori szkriptekkel futtathatja a szükséges parancsokat. Ez a szakasz a SqlPackage.exe eszköz meghívásának gyakori használati eseteit mutatja be. Az eszköz futtatásának előfeltételeként egy saját üzemeltetésű ügynököt kell használnia, és telepítenie kell az eszközt az ügynökre.

Feljegyzés

Ha az SQLPackage-t abból a mappából hajtja végre, ahol telepítve van, az elérési utat előtaggal & kell eljárnia, és dupla idézőjelekbe kell csomagolnia.

Alapszintű szintaxis

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

Az alábbi SQL-szkriptek bármelyikét használhatja a végrehajtani kívánt művelettől függően

Kinyerés

Létrehoz egy adatbázis-pillanatképfájlt (.dacpac) egy élő SQL-kiszolgálóról vagy a Microsoft Azure SQL Database-ből.

Parancs szintaxisa:

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

vagy

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

Példa:

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

Segítség:

sqlpackage.exe /Action:Extract /?

Közzététel

Növekményesen frissíti az adatbázissémát a forrás .dacpac fájl sémájának megfelelően. Ha az adatbázis nem létezik a kiszolgálón, a közzétételi művelet létrehozza azt. Ellenkező esetben egy meglévő adatbázis frissül.

Parancs szintaxisa:

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

Példa:

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

Segítség:

sqlpackage.exe /Action:Publish /?

Exportálás

Élő adatbázist exportál, beleértve az adatbázissémát és a felhasználói adatokat az SQL Serverről vagy a Microsoft Azure SQL Database-ből egy BACPAC-csomagba (.bacpac fájlba).

Parancs szintaxisa:

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

Példa:

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

Segítség:

sqlpackage.exe /Action:Export /?

Importálás

Importálja a séma- és táblaadatokat egy BACPAC-csomagból egy új felhasználói adatbázisba az SQL Server vagy a Microsoft Azure SQL Database egy példányában.

Parancs szintaxisa:

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

Példa:

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

Segítség:

sqlpackage.exe /Action:Import /?

DeployReport

Létrehoz egy XML-jelentést a közzétételi művelet által végrehajtott módosításokról.

Parancs szintaxisa:

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

Példa:

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" 

Segítség:

sqlpackage.exe /Action:DeployReport /?

DriftReport

Létrehoz egy XML-jelentést a regisztrált adatbázisok legutóbbi regisztrálása óta végrehajtott módosításokról.

Parancs szintaxisa:

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

Példa:

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

Segítség:

sqlpackage.exe /Action:DriftReport /?

Szkript

Létrehoz egy Transact-SQL növekményes frissítési szkriptet, amely frissíti a cél sémáját a forrás sémájának megfelelően.

Parancs szintaxisa:

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

Példa:

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"

Segítség:

sqlpackage.exe /Action:Script /?