Публикация DacPacs в Visual Studio 2013

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

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

  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.033, поскольку DacPac содержит информацию обо всей схеме БД (которая также должна включать изменения, сделанные в версии 1.0.32).

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

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
    }
}
Другие вопросы по тегам