回滚生成脚本

plu*_*rby 2 sql-server-2008 scripting transaction rollback

在应用程序的开发过程中,用户通常想要添加新模块、业务规则等。所以我经常使用 SQL Server 2008 选项从开发数据库创建脚本以生成新表,然后我将在发布之前在生产服务器上执行应用程序的新版本。

所以我想知道有没有办法将整个生成脚本文件放在事务中,如果在将所有内容返回到以前的状态时出现错误,没有添加新表,插入数据等时回滚更改。

如果有原因这不是推荐的方法,请解释。

Rem*_*anu 5

理论上你可以做一些事情,比如将脚本执行包装在一个事务中。您可以从处理 GO 批处理分隔符或脚本中的 sqlcmd 扩展名的应用程序库(如dbutilssqlcmd或 SMO)执行 .sql 批处理文件ServerConnection.ExecuteNonQuery

然而在实践中,这几乎是不可能做到的。由于锁定更改,将脚本包装在事务中可能会产生意外结果。事务中不允许某些 DDL 语句。该脚本可能包含 sqlcmd 扩展指令,例如:connect会弄乱整个事务处理。

另一种方法是使用迁移,它在应用程序中编码并处理更改的前滚和回滚。但是为了有效,这些步骤必须是幂等的(即使多次调用也会产生相同的结果),这在实践中很难实现。

最安全也是最简单的方法是依赖在迁移之前进行的备份,如果在部署 V.next 期间出现任何问题,这将提供回滚到备份的能力。如果将数据库快照用作备份,这将非常容易实现并且非常有效。

当然,如果有 24/7 可用性要求,事情会发生巨大变化,但是在不停机的情况下推出升级是一个更大的主题,这篇文章和解决方案将花费数百万美元,这不太可能是您想要的。