Публикация DacPacs в Visual Studio 2013
У меня есть проект базы данных SSDT в Visual Studio 2013. Он используется в качестве "листа ответов" при публикации обновлений базы данных для базы данных в других средах. Недавно я натолкнулся на статью в блоге Джейми Томпсона о DacPacs, где он пишет большое резюме о том, что такое DacPacs и как их использовать.
Теперь, скажем, у меня есть следующий сценарий:
- Проект SSDT в VS2013, версия 1.0.33
- База данных в моей среде разработки, версия 1.0.32
- База данных в моей среде 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
}
}