首页 > 解决方案 > 两个 dacpac 文件之间的详细差异

问题描述

我正在使用 sqlpackage 实用程序和 MSBuild 从我们的数据库和数据库项目中生成源和目标 .dacpac 文件。我知道我可以生成发布脚本,甚至可以生成部署报告,但这些报告只是高级别的。我想要做的是能够提供一份报告,准确地向我展示两个 dacpacs 之间的不同之处。例如,生成的发布脚本和 DeployReport.xml 向我显示特定存储过程已更改并将被覆盖,但它没有显示存储过程的哪些行已更改,因为它是一个非常长的存储过程,手动解决这个问题需要相当多的努力。

到目前为止,我已经尝试从 .dacpac 文件中提取包含的 model.xml 并使用 Diff 工具将我的 source.dacpac 中的 model.xml 与 target.dacpac 进行比较,但如果是从实时数据库和其他从数据库项目构建的,那么不幸的是,它们差异太大,无法向我展示有用的视觉效果。

在 Visual Studio 中,我当然可以打开“架构比较”工具并以这种方式比较我的 dacpac,但这太手动了,我正在寻找更自动化的解决方案。至少,从命令行触发此“架构比较”的方法会很好。

比较两个 dacpac 文件并详细地向我展示它们之间的差异的最佳方法是什么?即这 5 个存储的 procs 发生了变化,并直观地向我展示了 5 个 procs 中的每一个中哪些行发生了变化?我可以将某种解决方案粘在一起,但我不能购买任何第三方工具,我被 MS 提供的东西和我自己有限的能力所困。

标签: sql-servervisual-studiopowershellsql-server-data-toolssqlpackage

解决方案


不是最终解决方案,而是一种可能的方法:

# build publish script from old to new dacpac
SqlPackage.exe /a:Script /sf:old.dacpac /tf:new.dacpac /tdn:mydb /OutputPath:back.sql /Profile:publish.xml
# from new to old
SqlPackage.exe /a:Script /sf:new.dacpac /tf:old.dacpac /tdn:mydb /OutputPath:forth.sql /Profile:publish.xml

# compare them this way or another
Compare-Object -DifferenceObject (Get-Content ./forth.sql) -ReferenceObject (Get-Content ./back.sql) -SyncWindow 5 -IncludeEqual`
 | % { Write-Output ("{0} {1}" -f $_.SideIndicator, $_.InputObject); } | Out-File ./diff.txt

推荐阅读