2013 年 Visual Studio 发布 DacPac

Publishing DacPacs in Visual Studio 2013

我在 Visual Studio 2013 年有一个 SSDT 数据库项目。这在将数据库更新发布到其他环境中的数据库时用作 "answer sheet"。我最近遇到 Jamie Thompson's blog article on DacPacs,他在那里写了一篇关于什么是 DacPac 以及如何使用它们的精彩总结。

现在,假设我有以下场景:

  1. VS2013中的SSDT工程,版本为1.0.33
  2. 我开发环境中的一个数据库,版本是1.0.32
  3. 我的S-test环境中的一个数据库,版本为1.0.31

根据 Jamie 的说法,使用 DacPacs 发布数据库更改是幂等的,即我可以将 DacPac 从项目符号 1 中的 SSDT 项目发布到项目符号 3 中的数据库,它会在两个项目中完成对数据库的所有更改版本 1.0.32 和 1.033,因为 DacPac 包含有关 整个 数据库架构的信息(然后还应包括在版本 1.0.32 中所做的更改)。

这是对发布 DacPac 工作原理的正确理解吗?

是的,一旦您以声明方式在 DACPAC 中定义了模型,您就可以使用任何版本的数据库将模型部署到任何目标环境。 引擎会根据目标自动生成合适的更改脚本。

您可以从 Visual Studio 或使用 SqlPackage.exe 实用程序从命令行部署(发布)您的模型。下面是一个使用 SqlPackage.exe 和发布配置文件的 PowerShell 脚本示例。您可以选择直接发布或生成更改脚本(设置 $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 Server0\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
    }
}