トランザクションでテーブル構造を変更し、エラーが発生した場合にロールバックできますか?


15

ALTER TABLE実行中のステートメントがいくつかあります。すべてが機能するわけではありません(SQLデータ比較の実行結果です)。それらをいくつかのトランザクションにグループ化し、何か問題が発生した場合はステートメントをロールバックします。

これは可能ですか、それともロールバックできるデータのみですか?


Redgate SQL Compareについて話しているのですか?そこにある同期オプションの1つは、トランザクションIIRCを使用することです。そのため、そこで生成されたスクリプトを見て、このためのボイラープレートコードを確認できます。
マーティンスミス

はい、そうです。それを見てみましょう。
桟橋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ブロック?
ルークプレット

13

はい、これは可能です。

ほとんどのDDLステートメントは、SQL Serverでロールバックできます(などのいくつかの例外がありますCREATE DATABASE


6

多くのalteringsと1つのトランザクションで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

THROWSQL Serverバージョン> 2012でのみ機能することに注意してください。ここでは、バージョンをsemverから年表記に変換できます。http//sqlserverbuilds.blogspot.ru.ruドメインを認識しないでください。英語版があります)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.