2013 年 Visual Studio 发布 DacPac
Publishing DacPacs in Visual Studio 2013
我在 Visual Studio 2013 年有一个 SSDT 数据库项目。这在将数据库更新发布到其他环境中的数据库时用作 "answer sheet"。我最近遇到 Jamie Thompson's blog article on DacPacs,他在那里写了一篇关于什么是 DacPac 以及如何使用它们的精彩总结。
现在,假设我有以下场景:
- VS2013中的SSDT工程,版本为1.0.33
- 我开发环境中的一个数据库,版本是1.0.32
- 我的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
}
}
我在 Visual Studio 2013 年有一个 SSDT 数据库项目。这在将数据库更新发布到其他环境中的数据库时用作 "answer sheet"。我最近遇到 Jamie Thompson's blog article on DacPacs,他在那里写了一篇关于什么是 DacPac 以及如何使用它们的精彩总结。
现在,假设我有以下场景:
- VS2013中的SSDT工程,版本为1.0.33
- 我开发环境中的一个数据库,版本是1.0.32
- 我的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
}
}