Tôi có thể thay đổi cấu trúc bảng trong giao dịch và sau đó cuộn lại nếu có lỗi không?


15

Tôi có một số ALTER TABLEtuyên bố rằng tôi đang chạy. Không phải tất cả chúng đều hoạt động (chúng là kết quả của việc chạy So sánh dữ liệu SQL) và tôi muốn nhóm chúng trong một số giao dịch và khôi phục các báo cáo nếu có sự cố.

Điều này là có thể, hay chỉ là dữ liệu có thể được khôi phục?


Bạn đang nói về Redgate SQL So sánh? Một trong những tùy chọn đồng bộ hóa là sử dụng giao dịch IIRC để bạn có thể xem tập lệnh được tạo ở đó để xem một số mã tấm nồi hơi cho việc này.
Martin Smith

Vâng là tôi. Tôi sẽ xem xét điều đó.
Piers Karsenbarg

Câu trả lời:


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
Sẽ SET XACT_ABORT ONvà cuối cùng COMMIT TRANphủ nhận sự cần thiết cho các TRYkhối?
Luke Puplett

13

Vâng, điều này là có thể.

Hầu hết các câu lệnh DDL có thể được khôi phục trong SQL Server (Có một vài ngoại lệ như CREATE DATABASE)


6

Nhiều thay đổi trong một giao dịch với rollbackcommit- đó không phải là một giấc mơ. Điều đó là có thể.

Đây là một giàn giáo cho tập lệnh của bạn (theo hướng dẫn của MS với các cải tiến):

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

Hãy cẩn thận, THROWchỉ hoạt động cho phiên bản SQL SERVER> 2012. Ở đây bạn có thể chuyển đổi một phiên bản từ semver để ký hiệu năm : http://sqlserverbuilds.blogspot.ru (không biết .rutên miền, có một phiên bản tiếng Anh)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.