我有一个巨大的sql脚本,在我的db方案和我的数据中做了很多更改。该脚本包含GO命令。长脚本包括GO命令 - 如果失败则撤消
是否有任何方法来执行脚本并在发生任何错误时将其撤消?
因为有GO命令,所以我不能在事务中包装所有东西。
我有一个巨大的sql脚本,在我的db方案和我的数据中做了很多更改。该脚本包含GO命令。长脚本包括GO命令 - 如果失败则撤消
是否有任何方法来执行脚本并在发生任何错误时将其撤消?
因为有GO命令,所以我不能在事务中包装所有东西。
您可以在一个事务中包装多个批次,但您认为这是错误的,但事实是复杂的升级脚本不太可能在单个事务中执行。如果脚本无法从备份中恢复数据库,最好的解决方案是进行备份。
最好的方法是使用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每批结合本和/或使用临时表来控制流量(根据红门SQL比较脚本)
事务可以跨越多个批次。 –
@Martin SmithL我用BEGIN TRY - BEGIN TRANSACTION包装了所有的脚本,但这没有帮助。 – Naor