Sql server SSDT-如何:增量更新?

Sql server SSDT-如何:增量更新?,sql-server,database,version-control,sql-server-data-tools,Sql Server,Database,Version Control,Sql Server Data Tools,我正在使用VisualStudio中的数据库项目 在我的场景中,有几个客户使用不同版本的数据库 例如,一个客户在版本5中,另一个客户在版本7中 我提供了版本8的更新 客户端版本5应该在运行更新到版本8的脚本之前运行“累积”脚本(更新到版本6和7) 客户端版本7应该运行到版本8的升级 现在使用SSDT有没有什么自动方法可以做到这一点?使用msbuild:/p:GetVersion=cxxx 表单VS,在发布之前获取特定版本(在解决方案资源管理器中右键单击项目) 针对两个不同的目标运行此脚本,将为指

我正在使用VisualStudio中的数据库项目

在我的场景中,有几个客户使用不同版本的数据库

例如,一个客户在版本5中,另一个客户在版本7中

我提供了版本8的更新

客户端版本5应该在运行更新到版本8的脚本之前运行“累积”脚本(更新到版本6和7)

客户端版本7应该运行到版本8的升级


现在使用SSDT有没有什么自动方法可以做到这一点?使用msbuild:/p:GetVersion=cxxx

表单VS,在发布之前获取特定版本(在解决方案资源管理器中右键单击项目)

针对两个不同的目标运行此脚本,将为指定的目标创建发布脚本(每个目标一个)


如果改用dacpac,则在部署时通过与目标进行比较,从dacpac自动生成脚本。如果您想要部署相同的版本,您可以在两个目标上使用相同的dacpac文件,生成的脚本将专门为每个目标创建。

您应该提供dacpac,它是生成的输出,然后提供给它们以供部署


您可以通过SSMS手动部署它,也可以给他们一个运行sqlpackage.exe的命令行-这可以执行更新,也可以生成一个脚本来升级他们的数据库。

在使用SSDT时,部署数据库累积“版本”的概念就消失了(我认为)。必须理解的SSDT的基本概念是声明式数据库开发。我个人对声明性数据库开发的定义:

您可以定义希望数据库模式处于何种状态,而不是如何使其进入该状态。SSDT中的发布引擎将负责使数据库进入该状态

举个简单的例子,您的数据库中当前有一个名为[Person]的表,您希望添加一个名为[Person].[MiddleName]的列。在SSDT中定义新列,发布时,SSDT将发布类似于以下内容的内容:

ALTER TABLE [Person] ADD COLUMN [MiddleName]
关键是您不必编写SQL语句,SSDT会为您编写并执行它。
在这个场景中,数据库版本的概念消失了。您只能将数据库更新到SSDT项目中定义的状态。希望有帮助。

您是在VS中寻找自动生成还是发布?我正在寻找发布,SASGreat,然后使用参数GetVersion(如果您的示例中检查的版本8不是最新版本)。正如我在回答中所描述的那样,使用msbuild或使用您的构建中的dacpac进行部署。如果这样做有效,那就太棒了!所以我可以使用一个dacpac(我构建的结果)来更新任何客户端?在这种情况下,如果我生成一个dacpac版本8,并在尚未升级到版本6和版本7的客户机版本5上运行它,将正常工作?是的!一个文件到多个目标(包含不同版本)。脚本是在部署时创建的。如果要更新到生产服务器,最好在部署脚本之前生成并检查脚本,尤其是在部署过程中脚本处于联机状态时,因为某些更改可能会影响性能和锁表。此外,如果您有任何手动创建的脚本包含在预/后脚本中,他们必须在两个目标版本上都正确地工作。如果这能工作,那将是非常棒的!所以我可以使用一个dacpac(我构建的结果)来更新任何客户端?在这种情况下,如果我生成一个dacpac版本8,并在尚未升级到版本6而不是版本7的客户机版本5上运行它,会起作用吗?是的,这就是它应该起作用的方式-唯一需要注意的是如何处理破坏性的更改,如拆分表和任何引用数据的脚本。我支持@EdElliott的说法,首先根据生产环境的副本测试部署。您总是可能做了一些可能导致部署失败的事情(例如删除列)。默认情况下,SSDt将对数据库执行任何破坏性操作,它只会抛出一个错误,但是提前知道可能会发生错误仍然很好。这个工具非常棒。感谢您的回复。对于无法自动推断增量脚本的情况,或者如果需要自定义步骤,该怎么办?SSDT工作流中有什么可用于处理这些场景?(例如:需要将不可为null的列添加到包含现有记录的表中,并且必须使用自定义函数的结果填充列值)。如果SSDT正在生成delta脚本来修改给定序列中的多个DB对象,那么如何在生成的脚本中注入和修改自定义步骤?@cvacca您的观点非常好。如果检测到任何破坏性的更改,部署就会出错。(即检测数据丢失)。有些迁移步骤无法自动生成