আমি কি কোনও লেনদেনে টেবিলের কাঠামো পরিবর্তন করতে পারি এবং এরপরে ত্রুটি থাকলে তা আবার রোল করতে পারি?


15

আমার কিছু ALTER TABLEবক্তব্য রয়েছে যা আমি চালাচ্ছি। তাদের সবাই কাজ করে না (তারা এসকিউএল ডেটা তুলনা চালানোর ফলস্বরূপ) এবং আমি কিছু লেনদেনে তাদের গোষ্ঠীভুক্ত করতে চাই এবং কিছু ভুল হয়ে গেলে বিবৃতিগুলি ব্যাক করতে চাই।

এটি কি সম্ভব, না এটি কেবল ডেটা যা আবার ঘুরিয়ে দেওয়া যায়?


আপনি কি রেডগেট এসকিউএল তুলনা সম্পর্কে কথা বলছেন? আইআইআরসি লেনদেনগুলি ব্যবহার করার জন্য একটি সিঙ্ক্রোনাইজেশন বিকল্পগুলির মধ্যে রয়েছে যাতে এর জন্য কিছু বয়লার প্লেট কোড দেখতে আপনি সেখানে উত্পন্ন স্ক্রিপ্টটি দেখতে পারেন।
মার্টিন স্মিথ

হ্যাঁ আমি. আমি এটা একবার দেখে নেব।
পাইর্স কার্সেনবার্গ

উত্তর:


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

হ্যাঁ, এটি সম্ভব।

বেশিরভাগ ডিডিএল বিবৃতিগুলি এসকিউএল সার্ভারে ফিরে ঘোরানো যেতে পারে (কয়েকটি ব্যতিক্রম যেমন রয়েছে CREATE DATABASE)


6

এক সাথে লেনদেনে অনেকগুলি পরিবর্তনrollback এবং commit- এটি কোনও স্বপ্ন নয়। এটা সম্ভব.

আপনার স্ক্রিপ্টের জন্য এখানে একটি মজুদ রয়েছে ( উন্নতির সাথে এমএসের নির্দেশিকাগুলি অনুসরণ করা ):

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.