我可以更改事务中的表结构,然后在出现错误时将其回滚吗?


15

我有一些ALTER TABLE正在运行的声明。它们并不是全部都能工作(它们是运行SQL Data Compare的结果),我想将它们归类为某些事务,并在出现问题时回滚语句。

这是可能的,还是只有可以回滚的数据?


您是在谈论Redgate SQL Compare吗?同步选项之一是使用事务IIRC,因此您可以在此处查看生成的脚本,以查看一些模板代码。
马丁·史密斯

我是。我来看看。
Piers Karsenbarg 2012年

Answers:


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

在一次交易中与和进行许多更改 -这不是梦。有可能的。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域,有英文版本)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.