2009-10-28 2 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

그들이 모든 문 다음에 @@ TRANCOUNT를 @@ ERROR를 확인하고 ... 당신이 #temp 테이블에, 잼 그것을 설명으로 방법 레드 게이트 및 기타 비교 도구 일을 정확히하고 예를 들면 : 결국 #temp 테이블을 확인합니다. 오류가 발생하면 트랜잭션을 롤백하고 그렇지 않으면 커밋합니다. 이런 종류의 로직을 추가하기 위해 변경 스크립트를 생성하는 도구를 변경할 수 있다고 확신합니다. (또는 바퀴를 다시 발명하는 대신, 당신은 이미 당신을 위해 원자 스크립트를 생성하는 도구를 사용할 수 있습니다.)

+0

당신이 상기 도구를 제안 할 수 ? – NYSystemsAnalyst

+0

나는이 블로그 포스트에 많은 것을 적었습니다 : http://is.gd/4H8iZ (저는 Red-Gate 제품에 대한 풍부한 경험을 가지고 있으며 그것을 많이 추천합니다.) 다른 것들에 대해서는 많은 경험이 없습니다. 제품은 비슷하지만 RG는 여기에 뿌리 내리고 있으므로 계속 사용하고 있습니다.) –