我有一个巨大的sql脚本,它在我的数据库方案和数据中进行了很多更改。该脚本包括GO命令。
有没有办法执行脚本并在出现任何错误时将其撤消?
由于有GO命令,我无法将所有内容包装在事务中。
答案 0 :(得分:2)
你可以在一个事务中包装多个批次,你错了,但事实是复杂的升级脚本不可能在一个单独的事务中执行。您的最佳解决方案是进行备份,如果脚本失败,则从备份中恢复数据库。
答案 1 :(得分:1)
最好的方法是使用SET XACT_ABORT ON。这是批量中止并执行自动回滚。所以......
SET XACT_ABORT ON
GO
BEGIN TRAN
GO
--DO stuff
GO
IF XACT_STATE() = 1
--do more stuff
GO
IF XACT_STATE() = 1
--do more stuff
GO
....
GO
IF XACT_STATE() = 1
COMMIT TRAN
GO
您可以将它与每批次的TRY / CATCH结合使用和/或使用临时表来控制流程(根据Red Gate SQL Compare脚本)