트랜잭션에서 테이블 구조를 변경 한 다음 오류가있는 경우 롤백 할 수 있습니까?


15

내가 ALTER TABLE달리고 있다는 진술이 있습니다. 그들 모두가 작동하지는 않으며 (SQL 데이터 비교를 실행 한 결과) 일부 트랜잭션에서 그룹화하고 무언가 잘못되면 명령문을 롤백하고 싶습니다.

이것이 가능합니까, 아니면 롤백 할 수있는 데이터입니까?


Redgate SQL Compare에 대해 이야기하고 있습니까? 동기화 옵션 중 하나는 트랜잭션 IIRC를 사용하여 생성 된 스크립트를보고 이에 대한 보일러 플레이트 코드를 볼 수 있습니다.
Martin Smith

네 나는 그것을 볼 것이다.
교각 Karsenbarg

답변:


10
   BEGIN TRANSACTION
      BEGIN TRY
        ALTER TABLE1...
        ALTER TABLE2...
        -- Additional data/structural changes
        COMMIT
      END TRY
      BEGIN CATCH
         ROLLBACK;
         THROW; -- Only if you want reraise an exception (to determine the reason of the exception)
      END CATCH

3
겠습니까 SET XACT_ABORT ON및 최종 COMMIT TRAN무효화의 필요성 TRY블록?
Luke Puplett

13

예, 가능합니다.

대부분의 DDL 문은 SQL Server에서 롤백 할 수 있습니다 (와 같은 몇 가지 예외가 있습니다 CREATE DATABASE)


6

많은 alterings 하나의 트랜잭션 rollbackcommit- 그것은 꿈이 아니다. 것이 가능하다.

다음은 스크립트를위한 스캐 폴드입니다 ( MS 지침 에 따라 개선).

BEGIN TRANSACTION

BEGIN TRY
    -- place your script in this TRY block

    -- your DDL instructions:
    ALTER TABLE1...
    ALTER TABLE2...
    -- data modifications:
    EXEC('
        UPDATE A
        SET    c1 = 23,
               c2 = ''ZZXX'';
    ');
    -- another DDL instruction:
    ALTER TABLE2...

    -- end of your script
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;


    -- If you want reraise an exception (to determine the reason of the exception)
    -- just uncomment block with appropriate version:

    -- SQL SERVER > 2012
    /*
    THROW;
    */

    -- SQL SERVER < 2012 (tested against 2008 R2)
    /*
    DECLARE @ErrorMessage VARCHAR(MAX);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    RAISERROR (
        @ErrorMessage, -- Message text.
        @ErrorSeverity, -- Severity.
        @ErrorState -- State.
    );
    */
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
GO

조심 THROW>에만 SQL Server 버전 작동 여기에 2012 년은에서 버전을 변환 할 수 semver해 표기 : http://sqlserverbuilds.blogspot.ru (인식하지 않는 .ru도메인, 영어 버전이)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.