Генерировать SQL Сценарий изменения схемы сервера на Azure конвейере DevOps - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь разрешить конвейеру публиковать sh изменение схемы на локальном SQL экземпляре Server 2017, но я хочу сделать это в два этапа:

  • Создать действие сценария изменения схемы
  • После утверждения publi sh

Я знаю, что это может быть достигнуто путем публикации в SQL Azure путем установки deploymentAction: 'Script', а затем deploymentAction: 'Publish'

Есть ли способ опубликовать sh на локальном SQL сервере аналогичным образом? Я попытался выполнить задачу SqlDacpacDeploymentOnMachineGroup , но выполнить ее в два этапа с помощью этой задачи не представляется возможным.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Я не думаю, что есть встроенная задача, которая может сделать это для вас. Тем не менее, SQLPackage.exe имеет возможность. Взгляните на этот пост: http://diegogiacomelli.com.br/azure-pipelines-generating-db-script/. В нем описывается использование задачи командной строки для создания сценария sql.

Когда у вас есть сценарий, вы можете использовать SqlDacpacDeploymentOnMachineGroup для публикации sh сценария (хотя он не будет повторно использовать уже созданный сценарий), или вы можете написать сценарий powershell, который публикует сценарий sql в базе данных. Пример такого скрипта можно найти здесь: https://careers.centric.eu/nl/blog/custom-azure-devops-pipeline-task-execute-sql-script/

0 голосов
/ 21 апреля 2020

Мне наконец-то удалось реализовать 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)'
...