在 Azure DevOps 管道上生成 SQL Server 架构更改脚本

rsy*_*rsy 3 sql-server azure azure-devops azure-pipelines

我试图允许管道将架构更改发布到本地 SQL Server 2017 实例,但我想分两步完成:

  • 生成架构更改脚本操作
  • 审核通过后发布

我知道可以通过设置发布到 SQL Azure来实现deploymentAction: 'Script'deploymentAction: 'Publish'

有没有办法以类似的方式发布到本地 SQL Server?我已经尝试过SqlDacpacDeploymentOnMachineGroup任务,但似乎不可能通过此任务分两步完成

rsy*_*rsy 5

我终于成功地通过数据库更改实现了 SQL 模式生成,然后发布了这些更改(在批准后)。一些备注:

  • 如果更改会导致数据丢失,则此方法将不起作用。
  • sqlpackage仅当安装了 Visual Studio 2019 时,路径才正确,就像在windows-2019图像中一样。
  • 先前package.dacpac是通过构建.sqlproj项目生成的。
  • 我通过组变量传递了以下变量(有关如何创建组变量的更多信息,请参见此处):
    • targetDBConnectionString
    • servername
    • databasename
    • adminlogin
    • adminPassword
  • 我已向舞台添加了批准ApplyChanges在“管道”菜单中,选择环境,然后选择ApplyChanges 环境,然后approvals and checks从右上角的三点按钮)。这样,在手动批准之前,更改不会应用到数据库。

stage: VerifyScript
      displayName: 'Script database schema changes'
      dependsOn: 
        - Build
      jobs:
      - deployment: VerifyScript
        pool:
          vmImage: 'windows-2019'
        variables:
        - group: 'Timeline CV - Release'
        environment: 'scriptverification'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: dropDacpac
                patterns: '**/*'

          - task: CmdLine@2
            displayName: 'Generate schema changes script'
            inputs:
              script: |
                "c:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\sqlpackage.exe"    ^
                /action:script ^
                /diagnostics:true ^
                /sourcefile:$(Pipeline.Workspace)\dropDacpac\path\to\the\dacpacFile\package.dacpac    ^
                /targetConnectionString:$(targetDBConnectionString) ^
                /outputpath:$(Build.StagingDirectory)\changesScript.sql

          - task: PublishPipelineArtifact@1
            inputs:
              targetPath: '$(Build.StagingDirectory)'
              artifactName: dropSqlSchemaChangesScript
            condition: succeededOrFailed()

          - task: PowerShell@2
            displayName: Show Auto Generated SQL Script
            inputs: 
              targetType: 'inline'
              script: | 
                Write-Host "Auto Generated SQL Update Script:"
                Get-Content $(Build.StagingDirectory)\changesScript.sql | foreach {Write-Output      $_}

- stage: ApplyChanges
  displayName: 'Apply database schema changes'
  dependsOn: VerifyScript
  jobs:
  - deployment: ApplyChanges
    pool:
      vmImage: 'windows-2019'
    variables:
    - group: 'Timeline CV - Release'
    environment: 'applyChanges'
    strategy:
      runOnce:
        deploy:
          steps:
          - download: current
            artifact: dropSqlSchemaChangesScript
          - task: SqlDacpacDeploymentOnMachineGroup@0
            displayName: 'Deploy SQL schema changes script'
            inputs:
              taskType: 'sqlQuery'
              sqlFile: '$(Pipeline.Workspace)\dropSqlSchemaChangesScript\changesScript.sql'
              targetMethod: 'server'
              authScheme: 'sqlServerAuthentication'
              serverName: '$(servername)'
              databaseName: '$(databasename)'
              sqlUsername: '$(adminlogin)'
              sqlPassword: '$(adminPassword)'
Run Code Online (Sandbox Code Playgroud)