2009-10-28 86 views
2

對於我的數據庫升級腳本,我通常只有一個長腳本,對該數據庫版本進行了必要的更改。但是,如果一個語句在腳本中途失敗,則會使數據庫處於不一致狀態。原子升級腳本

我該如何讓整個升級腳本進行一次原子操作?我試過只是在一個事務中包裝所有的語句,但這是行不通的。即使使用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 

回答

1

方式紅門和其他比較工具的工作是完全按照你描述......他們每個語句之後檢查@@ ERROR和@@ TRANCOUNT,果醬它變成一個#TEMP表,最後他們檢查#temp表。如果發生任何錯誤,它們會回滾事務,否則它們會提交。我相信你可以改變任何工具生成你的改變腳本來添加這種邏輯。 (或代替重新發明輪子,你可以使用已爲您創建原子腳本的工具。)

+0

你可以提出任何的表示工具? – NYSystemsAnalyst 2009-10-29 12:33:45

+0

我在這篇博文中列出了很多:http://is.gd/4H8iZ(我對Red-Gate產品有着豐富的經驗,並且非常推薦它,我沒有太多其他經驗。產品是可比較的,但RG在這裏是根深蒂固的,所以這是我繼續使用的。) – 2009-10-29 13:37:22