Скрипты атомного обновления - PullRequest
2 голосов
/ 28 октября 2009

С моими сценариями обновления базы данных у меня обычно есть только один длинный сценарий, который вносит необходимые изменения для этой версии базы данных. Тем не менее, если один оператор завершается ошибкой в ​​середине сценария, он оставляет базу данных в несогласованном состоянии.

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

Ответы [ 2 ]

1 голос
/ 28 октября 2009

Red-Gate и другие инструменты сравнения работают точно так, как вы описали ... они проверяют @@ ERROR и @@ TRANCOUNT после каждого оператора, вставляют его в таблицу #temp и в конце проверяют временная таблица. Если какие-либо ошибки произошли, они откатывают транзакцию, иначе они фиксируют. Я уверен, что вы можете изменить любой инструмент, генерирующий ваши сценарии изменений, чтобы добавить такую ​​логику. (Или вместо того, чтобы заново изобретать колесо, вы можете использовать инструмент, который уже создает для вас атомарные скрипты.)

0 голосов
/ 14 декабря 2010

Что-то вроде:

TRY
 ....
CATCH
ROLLBACK TRAN

http://msdn.microsoft.com/en-us/library/ms175976.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...