Sql server 如何使DACPAC只更新一个模式?

Sql server 如何使DACPAC只更新一个模式?,sql-server,azure-sql-database,sql-server-data-tools,dacpac,Sql Server,Azure Sql Database,Sql Server Data Tools,Dacpac,我有一个带有*.sqlproj项目的VS2013解决方案,其中包含特定于此解决方案的对象。问题是,这对于其他项目来说也是很常见的 我的问题是在不影响其他对象的情况下,自动将模式中的更改部署到数据库。默认情况下,DACPAC会更新整个数据库,这在我的情况下是不需要的 我试图编写deployment contributor,但似乎无法将其放在解决方案文件夹中,因为它必须放在SQL server的Program Files子文件夹中 我使用竹子创建部署包,该应用程序托管在Microsoft Azure

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

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

我试图编写deployment contributor,但似乎无法将其放在解决方案文件夹中,因为它必须放在SQL server的Program Files子文件夹中

我使用竹子创建部署包,该应用程序托管在Microsoft Azure上,带有Azure SQL数据库


是否有任何方法可以使用DACPAC或其他自动方式仅在我的架构内部署DB更改?

您的两个选项如下:

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

  • 从dacpac中筛选出与其他架构相关的对象,然后使用DropObjectsNotInSource=false进行部署。这不太理想,因为它不会删除您删除的对象,但好处是您可以在构建时/传递给部署团队之前执行此操作


  • 请注意,我写的文章中介绍了这个基本主题,本文中有一些例子。听起来您已经编写了选项1(本教程有一个简化版本,只阻止添加,不阻止更改/删除),但是您可以看到它们之间的比较。此外,这些示例还显示了如何使用我们的API发布(这直接映射到使用SqlPackage.exe),以及如何轻松测试和验证参与者行为。

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

    如何部署Dacpac?您对它有控制权吗,或者它是从远程位置运行的?我这样问是因为您可以将扩展DLL放在与Dac DLL(Microsoft.Data.Tools.Schema.Sql.DLL)相同的目录中。因此,如果您可以包括这些和您的扩展,并使用SqlPackage创建dacpac,这可能会起作用吗?请注意,安装是在客户端计算机上的SQL Server目录下进行的,因此如果您可以从那里运行,那么部署到Azure的事实应该不会有任何区别。目前,dacpac由部署团队执行。可能无法在他们的计算机或生成服务器上进行系统范围的修改,因此我正在寻找一种方法来引用我的解决方案文件夹中的contributor DLL,或者以其他方式忽略DACPAC中的其他架构。感谢您的回复。您能告诉我如何在构建时设置DropObjectsNotInSource吗?我试图在第一个属性组中设置
    False
    ,但它似乎被忽略,对象仍然被删除。我只是检查了目标文件(C:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v12.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets),其中有两个不同的变量,一个用于F5部署,另一个用于发布。对于F5,您的部署应该是正确的。对于发布,它应该是。请注意,如果愿意,也可以在发布配置文件中设置此选项。另外,如果您想了解发布过程中发生的更多信息,请在命令行中使用/v:diag标志运行该任务,以获得详细的输出。