Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
U kunt uw database-updates automatisch implementeren in Azure SQL Database na elke geslaagde build.
Vereiste voorwaarden
| Product | vereisten |
|---|---|
| Azure DevOps | - Een Azure DevOps-project. - Toestemmingen: - Als u serviceverbindingen wilt maken, moet u de Administrator-- of Creator- rol hebben voor serviceverbindingen. |
DACPAC
De eenvoudigste manier om een database te implementeren, is met behulp van een gegevenslaagpakket of DACPAC. MET DACPACs kunt u schemawijzigingen en -gegevens verpakken en implementeren. U kunt een DACPAC maken met behulp van het SQL Database-project in Visual Studio.
De azure SQL Database-implementatietaak is het primaire mechanisme voor het implementeren van een database in Azure. Deze taak, net als bij andere ingebouwde Azure-taken, vereist een Azure-serviceverbinding als invoer. De Azure-serviceverbinding slaat de referenties op om vanuit Azure Pipelines verbinding te maken met Azure.
De eenvoudigste manier om aan de slag te gaan met deze taak is door u aan temelden als een gebruiker die eigenaar is van zowel de Azure DevOps-organisatie als het Azure-abonnement. In dit geval hoeft u de serviceverbinding niet handmatig te maken. Zie Een Azure-serviceverbinding maken voor meer informatie over het maken van een Azure-serviceverbinding.
Als u een DACPAC wilt implementeren in een Azure SQL-database, gebruikt u de azure SQL Database-implementatietaak. Voeg het volgende fragment toe aan uw YAML-bestand:
- 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>'
SQL-scripts
U kunt ook SQL-scripts gebruiken in plaats van DACPAC om uw database te implementeren. Hieronder ziet u een eenvoudig SQL-script waarmee een lege database wordt gemaakt:
USE [main]
GO
IF NOT EXISTS (SELECT name FROM main.sys.databases WHERE name = N'DatabaseExample')
CREATE DATABASE [DatabaseExample]
GO
Als u SQL-scripts vanuit uw pijplijn wilt uitvoeren, moet u firewallregels toevoegen en verwijderen in Azure. Zonder deze regels kan de Azure Pipelines-agent niet communiceren met Azure SQL Database.
Azure-firewallregels instellen
Met het volgende PowerShell-script worden firewallregels gemaakt. Sla deze op als SetAzureFirewallRule.ps1 en voeg deze toe aan uw opslagplaats:
[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
Azure-firewallregels verwijderen
Met het volgende PowerShell-script worden firewallregels verwijderd. Sla deze op als RemoveAzureFirewallRule.ps1 en voeg deze toe aan uw opslagplaats:
[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
Database implementeren met SQL-scripts
In het volgende voorbeeld worden de stappen beschreven voor het toevoegen van firewallregels, het implementeren van uw database met behulp van SQL-scripts en het verwijderen van de firewallregels:
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: 'Set Azure firewall rules'
inputs:
azureSubscription: '$(AzureSubscription)'
ScriptType: filePath
ScriptPath: '$(Build.SourcesDirectory)\scripts\SetAzureFirewallRule.ps1'
ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
azurePowerShellVersion: LatestVersion
- task: PowerShell@2
displayName: 'Install SqlServer module if not present'
inputs:
targetType: 'inline'
script: |
if (-not (Get-Module -ListAvailable -Name SqlServer)) {
Install-Module -Name SqlServer -Force -AllowClobber
}
- task: PowerShell@2
displayName: 'Deploy database'
inputs:
targetType: 'inline'
script: |
Invoke-Sqlcmd -InputFile $(SQLFile) -ServerInstance $(ServerFqdn) -Database $(DatabaseName) -Username $(AdminUser) -Password $(AdminPassword)
- task: AzurePowerShell@5
displayName: 'Remove Azure firewall rules'
inputs:
azureSubscription: '$(AzureSubscription)'
ScriptType: filePath
ScriptPath: '$(Build.SourcesDirectory)\scripts\RemoveAzureFirewallRule.ps1'
ScriptArguments: '-ServerName $(ServerName) -ResourceGroupName $(ResourceGroupName)'
azurePowerShellVersion: LatestVersion
Database voorwaardelijk implementeren
U kunt ervoor kiezen om alleen specifieke builds in uw Azure-database te implementeren, zodat u meer controle hebt over welke wijzigingen worden toegepast op basis van criteria zoals de bronbranch of de buildstatus.
U kunt dit doen in YAML door een van deze technieken te gebruiken:
Isoleer de implementatiestappen in een afzonderlijke taak en pas een voorwaarde toe op die taak.
Voeg rechtstreeks een voorwaarde toe aan de stap.
In het onderstaande voorbeeld ziet u hoe u alleen builds implementeert vanuit de hoofdbranch met behulp van voorwaarden:
- 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>'
Meer SQL-acties
De SQL Azure Dacpac-implementatietaak omvat mogelijk niet alle SQL-serveracties die u moet uitvoeren. In dergelijke gevallen kunt u PowerShell- of opdrachtregelscripts gebruiken om de vereiste opdrachten uit te voeren.
In deze sectie worden veelvoorkomende use cases beschreven voor het aanroepen van het hulpprogrammaSqlPackage.exe. Voordat u dit hulpprogramma uitvoert, moet u ervoor zorgen dat u een zelf-hostende agent gebruikt waarop het hulpprogramma is geïnstalleerd.
Notitie
Als u SQLPackage uitvoert vanuit de map waarin het is geïnstalleerd, moet u het pad vooraf laten gaan door & en het pad tussen dubbele aanhalingstekens plaatsen.
Basissyntaxis
<Path of SQLPackage.exe> <Arguments to SQLPackage.exe>
U kunt een van de volgende SQL-scripts gebruiken op basis van de actie die u wilt uitvoeren:
- extraheren
- Publiceren
- Exporteren
- Invoer
- DeployReport
- DriftReport
- Script
Hiermee maakt u een databasemomentopnamebestand (.dacpac) op basis van een live SQL-server of Microsoft Azure SQL Database.
Opdrachtsyntaxis:
SqlPackage.exe /TargetFile:"<Target location of dacpac file>" /Action:Extract
/SourceServerName:"<ServerName>.database.windows.net"
/SourceDatabaseName:"<DatabaseName>" /SourceUser:"<Username>" /SourcePassword:"<Password>"
of
SqlPackage.exe /action:Extract /tf:"<Target location of dacpac file>"
/SourceConnectionString:"Data Source=ServerName;Initial Catalog=DatabaseName;Integrated Security=SSPI;Persist Security Info=False;"
Voorbeeld:
SqlPackage.exe /TargetFile:"C:\temp\test.dacpac" /Action:Extract /SourceServerName:"DemoSqlServer.database.windows.net.placeholder"
/SourceDatabaseName:"Testdb" /SourceUser:"ajay" /SourcePassword:"SQLPassword"
Hulp:
sqlpackage.exe /Action:Extract /?