С моими сценариями обновления базы данных у меня обычно есть только один длинный сценарий, который вносит необходимые изменения для этой версии базы данных. Тем не менее, если один оператор завершается ошибкой в середине сценария, он оставляет базу данных в несогласованном состоянии.
Как мне сделать весь скрипт обновления за одну атомарную операцию? Я пытался просто обернуть все операторы в транзакции, но это не работает. Даже при 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