如何使DACPAC只更新一个架构?

时间:2014-05-08 18:45:24

标签: sql-server azure-sql-database sql-server-data-tools dacpac

我有一个带有* .sqlproj项目的VS2013解决方案,其中包含特定于此解决方案的对象。问题是这也是其他项目的常见数据库。

我的问题是自动将我的架构中的更改部署到数据库,而不会影响其他对象。默认情况下,DACPAC会更新我的案例中不需要的整个数据库。

我尝试编写部署贡献者http://msdn.microsoft.com/en-us/library/dn268597(v=vs.103).aspx,但似乎没有办法将其放在解决方案文件夹中,因为它必须放在SQL Server的Program Files子文件夹中。

我使用Bamboo创建部署包,应用程序使用Azure SQL数据库托管在Microsoft Azure上。

有什么办法可以使用DACPAC或其他自动方式在我的架构中部署数据库更改?

2 个答案:

答案 0 :(得分:4)

您的两个选项如下:

  1. 将SqlPackage.exe和其他DAC DLL复制到解决方案内的文件夹,或由部署团队控制的文件夹。同时将您的贡献者DLL复制到同一文件夹。然后确保在部署时使用该位置的SqlPackage.exe。由于将检查与Microsoft.Data.Tools.Schema.Sql.dll在同一文件夹中的任何DLL的扩展名,因此您可以使用此方法在部署期间包含您的贡献者,而无需安装到系统范围的位置。 / p>

  2. 从dacpac中过滤掉与其他模式相关的对象,然后使用DropObjectsNotInSource = false进行部署。这不太理想,因为它不会丢弃您删除的对象,但好处是您可以在构建时/在传递给部署团队之前完成。

  3. 请注意,我写的API tutorial中介绍了这个基本主题,并在此samples project中提供了一些示例。听起来你已经编写了#1选项(该教程有一个简化版本,只能阻止添加,而不是更改/删除),但你可以看到它们之间的比较。此外,示例还展示了如何使用我们的API发布(这直接映射到使用SqlPackage.exe)以及如何轻松测试和验证贡献者行为。

答案 1 :(得分:0)

您可以使用DacpacMarge库构建部署,这会将数据库中的模型与用于单个架构的模型合并到新的DacPac中。此新生成的Dacpac可以在不影响其他对象的情况下进行部署,因为它们与数据库当前定义相同。