SqlPackage.exe 和 MsBuild SqlPublishTask 之间的差异

Differences between SqlPackage.exe and MsBuild SqlPublishTask

我正在尝试生成一个输出 dacpac 文件,然后我可以将该文件部署到不同的环境。到目前为止,我一直使用目标发布直接从 msbuild 进行部署,例如:

msbuild dbproject.sqlproj /t:Build;Publish /p:SqlPublishProfilePath=test.publish.xml  /p:UpdateDatabase=True  /p:PublishScriptFileName=test.sql

生成的输出脚本的大小(仅供参考,因为 UpdateDatabase 设置为 true)为 2.5MB。

我的新方法是只构建项目,存储 dacpac,然后使用带有操作的 sqlpackage 进行部署 'Publish'。此新方法报告了一些 msbuild SqlPublishTask 未报告的警告。
供参考我运行下一个命令:

sqlpackage.exe /action:script /outputpath:test.sql /sourcefile:dbproject.dacpac /pr:test.publish.xml

输出脚本的大小现在是 4.9MB。
具体报的warnings不是这里关心的,关心的是脚本不一样,我的问题是有什么区别?
更重要的是,哪个是 best/safest 部署方法?

Sqlpackage.exe 更详细并且在部署期间包含更多对象,它将权限降低到 tables 以避免在修改对象期间进行任何修改,然后继续创建或修改他们。
不同之处在于,所有对象都包含在 sqlpackage 的脚本中,与它们是否与目标数据库不同无关。

尽管最初给出的警告不是问题,但使用 sqlpackage 方法我发现一些存储过程不在解决方案中,只在数据库中。这些 'orphan' sp 正在引用正在部署的 tables,这会发出警告,指出 table 中的更改可能会破坏 sp.