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: 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-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.placeholder"
/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.placeholder"
/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.placeholder"
/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.placeholder"
/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.placeholder"
/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.placeholder" /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.placeholder"
/TargetDatabaseName:"Testdb" /TargetUser:"ajay" /TargetPassword:"SQLPassword" /OutputPath:"C:\temp\test.sql"
/Variables:StagingDatabase="Staging DB Variable value"
Segítség:
sqlpackage.exe /Action:Script /?