【发布时间】:2013-09-24 04:42:22
【问题描述】:
我们可以使用 TFS&SSDT 创建 SQLServer 部署脚本,但是有没有办法创建回滚脚本,以便我们可以回滚部署? 谢谢
【问题讨论】:
标签: sql-server tfs sql-server-data-tools
我们可以使用 TFS&SSDT 创建 SQLServer 部署脚本,但是有没有办法创建回滚脚本,以便我们可以回滚部署? 谢谢
【问题讨论】:
标签: sql-server tfs sql-server-data-tools
由于 SSDT(和类似产品)都通过将项目中的架构与实时数据库进行比较以使数据库与模型同步来工作,因此没有直接的方法来创建回滚脚本。还有一些关于通过部署前或部署后脚本更改/添加/删除数据的注意事项。
话虽如此,但有几个选择。
您需要相应地编写代码以回滚数据更改。这可能有点棘手,因为每种情况都不同。您需要确保编写的脚本可以撤消发布中的任何更改。如果您插入了一行,则需要一个回滚脚本来删除它。如果您更新了一堆数据,则需要备份该数据或通过其他方式将其取回。
【讨论】:
Id INT, Name VARCHAR(10)。然后在 2.0 中,将其更改为 Id BIGINT, Name VARCHAR(10), Description VARCHAR(1000)。 SSDT 当然会改变Id 列的类型,并添加Description 列。如果您现在尝试重新发布版本 1 架构,SSDT 将删除 Description,并将 Id 更改回 INT。 SSDT 部署说“这就是我希望数据库看起来的样子”,而 SSDT 只会进行必要的更改以使架构看起来像这样。以前的版本仍然只是不同的目标架构。
在对数据库项目进行任何更改之前,我会拍摄快照(dacpac),我可以将修改后的数据库项目与它进行比较以生成发布脚本。虽然交换源和目标以进行反向模式比较很容易,但我发现它不会让我从反向比较生成更新脚本(这将是回滚脚本),大概是因为目标是数据库项目。
要解决该问题并生成回滚脚本,我执行以下操作:
将修改后的数据库项目部署到我的(localdb)开发数据库中;
在进行更改之前,从源代码管理中签出数据库项目的早期版本;
运行架构比较,从以前版本的数据库项目与 (localdb) 开发数据库进行比较;
使用架构比较生成更新脚本。此更新脚本将是一个回滚脚本。
虽然能够更直接地生成回滚脚本会很好,但上面的四步过程只需不到五分钟。
【讨论】: