ฉันสามารถเปลี่ยนโครงสร้างตารางในธุรกรรมแล้วย้อนกลับหากมีข้อผิดพลาดได้หรือไม่?


15

ฉันมีALTER TABLEข้อความบางส่วนที่ฉันใช้อยู่ ไม่ใช่ทั้งหมดที่ทำงาน (เป็นผลมาจากการรันการเปรียบเทียบข้อมูล SQL) และฉันต้องการจัดกลุ่มพวกเขาในบางธุรกรรมและย้อนกลับคำสั่งหากมีสิ่งผิดปกติ

เป็นไปได้หรือเป็นเพียงข้อมูลที่สามารถย้อนกลับได้?


คุณกำลังพูดเกี่ยวกับ Redgate SQL หนึ่งในตัวเลือกการซิงโครไนซ์คือการใช้ธุรกรรม 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

การเปลี่ยนแปลงจำนวนมากในการทำธุรกรรมด้วยrollbackและcommit- มันไม่ใช่ความฝัน มันเป็นไปได้.

นี่คือโครงสร้างสำหรับสคริปต์ของคุณ ( ปฏิบัติตามแนวทาง 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> 2012 ที่นี่คุณสามารถแปลงรุ่นจากรูปแบบsemverเป็นรูปแบบปี : http://sqlserverbuilds.blogspot.ru (ไม่ทราบ.ruโดเมนมีรุ่นภาษาอังกฤษ)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.