【发布时间】:2009-10-28 15:02:49
【问题描述】:
对于我的数据库升级脚本,我通常只有一个长脚本,用于对该数据库版本进行必要的更改。但是,如果一个语句在脚本执行到一半时失败,它会使数据库处于不一致的状态。
如何使整个升级脚本成为一个原子操作?我尝试将所有语句包装在事务中,但这不起作用。即使 SET XACT_ABORT ON,如果一个语句失败并回滚事务,其余语句仍会继续执行。我想要一个不需要我在每个语句之前写 IF @@TRANCOUNT > 0... 的解决方案。例如:
SET XACT_ABORT ON;
GO
BEGIN TRANSACTION;
GO
CREATE TABLE dbo.Customer
(
CustomerID int NOT NULL
, CustomerName varchar(100) NOT NULL
);
GO
CREATE TABLE [dbo].[Order]
(
OrderID int NOT NULL
, OrderDesc varchar(100) NOT NULL
);
GO
/* This causes error and should terminate entire script. */
ALTER TABLE dbo.Order2 ADD
A int;
GO
CREATE TABLE dbo.CustomerOrder
(
CustomerID int NOT NULL
, OrderID int NOT NULL
);
GO
COMMIT TRANSACTION;
GO
【问题讨论】:
标签: sql sql-server-2005 tsql