Публикация пакетов DacPac в Visual Studio 2013

У меня есть проект базы данных SSDT в Visual Studio 2013. Он используется в качестве «листа ответов» при публикации обновлений базы данных в базе данных в других средах. Недавно я наткнулся на статью Джейми Томпсона в блоге о DacPac, где он пишет отличное резюме о том, что такое DacPac и как их использовать.

Теперь, скажем, у меня есть следующий сценарий:

  1. Проект SSDT в VS2013 версии 1.0.33.
  2. База данных в моей среде разработки версии 1.0.32.
  3. База данных в моей среде S-test версии 1.0.31.

По словам Джейми, публикация изменений баз данных с использованием DacPacs является идемпотентной, т. е. я могу опубликовать DacPac из проекта SSDT в списке 1 в базу данных в списке 3, и он получит все изменения, внесенные в базу данных как в версии 1.0.32, так и в версии 1.0.32. 1.033, так как DacPac содержит информацию о полной схеме БД (которая также должна включать изменения, сделанные в версии 1.0.32).

Это правильное понимание того, как работает публикация DacPac?


person nils1k    schedule 10.07.2015    source источник
comment
Да, правильно. И вы также можете развернуть свой dacpac из командной строки, используя SqlPackage.exe.   -  person lucazav    schedule 10.07.2015
comment
Превосходно. Спасибо за подтверждение, lucazav. Кстати, знаете ли вы, есть ли какие-либо ограничения в отношении того, как публикация обрабатывает обновления данных в БД, например. если я добавлю новую строку в таблицу поиска?   -  person nils1k    schedule 10.07.2015
comment
эй, нильс - взгляните на это, чтобы узнать, как обрабатывать данные поиска the.agilesql.club/Blog/Ed-Elliott/   -  person Ed Elliott    schedule 10.07.2015
comment
Эй, Эд. Большое спасибо - я прочитаю серию ваших блогов.   -  person nils1k    schedule 10.07.2015
comment
У меня была такая же ссылка под мышкой. +1 @EdElliott за его скорость! :) nils, если хотите, я могу ответить на ваш вопрос, опубликовав скрипт PowerShell, который поможет вам опубликовать ваш dacpac из командной строки. Просто дай мне знать.   -  person lucazav    schedule 10.07.2015
comment
ура ребята! Лука, сделай это или запиши в блог!   -  person Ed Elliott    schedule 10.07.2015
comment
Я уже создал скрипт для публикации dacpac, прежде чем задавать вопрос, @lucazav. Спасибо хоть :).   -  person nils1k    schedule 10.07.2015


Ответы (1)


Да, после того как вы определили свою модель в DACPAC декларативным способом, вы можете затем развернуть свою модель в любой целевой среде с любой версией вашей базы данных. Движок автоматически сгенерирует надлежащие сценарии изменений в соответствии с целью.

Вы можете развернуть (опубликовать) свою модель из Visual Studio или из командной строки с помощью утилиты SqlPackage.exe. Вот пример сценария PowerShell, использующего SqlPackage.exe и файл профиля публикации. Вы можете опубликовать напрямую или сгенерировать сценарий изменения (установите переменную $action). Файл DACPAC и файл профиля публикации должны находиться в одной папке с файлом ps. Будет создан файл журнала:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

####################################
$action                 = 'Publish' #Only generate script: 'Script'; Publish directly: 'Publish'

$databaseName       = 'Test'
$serverName         = 'localhost'
$dacpacPath         = Join-Path $scriptPath '.\Test\bin\Debug\Test.dacpac'
$publishProfilePath = Join-Path $scriptPath '.\Test\Scripts\Publish\Test.publish.xml'


$outputChangeScriptPath = Join-Path $scriptPath 'TestDeploymentScript.sql'

$logPath = Join-Path $scriptPath 'TestDeployment.log'
####################################



$sqlPackageExe = 'C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe'

if ($action.ToUpper() -eq 'SCRIPT')
{

    Write-Host '********************************' | Tee-Object -File "$logPath"
    Write-Host '*  Database Objects Scripting  *' | Tee-Object -File "$logPath"
    Write-Host '********************************' | Tee-Object -File "$logPath"

    $args = "/Action:Script /TargetDatabaseName:$databaseName /TargetServerName:$serverName " +
            "/SourceFile:""$dacpacPath"" /Profile:""$publishProfilePath"" /OutputPath:""$outputChangeScriptPath"" "

    $command = "& ""{0}"" {1}" -F $sqlPackageExe, $args

    Invoke-Expression $command | Tee-Object -File "$logPath"

    if($LASTEXITCODE -ne 0)
    {
        $commandExitCode = $LASTEXITCODE 
        $Error[0] | Tee-Object -File $outputChangeScriptPath
        return $commandExitCode
    }

}

if ($action.ToUpper() -eq 'PUBLISH')
{
    # DWH
    Write-Host '*********************************' | Tee-Object -File "$logPath"
    Write-Host '*  Database Objects Deployment  *' | Tee-Object -File "$logPath"
    Write-Host '*********************************' | Tee-Object -File "$logPath"

    $args = "/Action:Publish /TargetDatabaseName:$databaseName /TargetServerName:$serverName " +
            "/SourceFile:""$dacpacPath"" /Profile:""$publishProfilePath"" "

    $command = "& ""{0}"" {1}" -F $sqlPackageExe, $args

    Invoke-Expression $command | Tee-Object -File "$logPath"

    if($LASTEXITCODE -ne 0)
    {
        $commandExitCode = $LASTEXITCODE 
        $Error[0] | Tee-Object -File $outputChangeScriptPath
        return $commandExitCode
    }
}
person lucazav    schedule 10.07.2015
comment
Мне нравится скрипт powershell. Я просто использовал пакетные файлы для выполнения того же (старая школа), но это немного более надежно и может немного лучше обрабатывать ошибки. - person Peter Schott; 13.07.2015