সীমাবদ্ধতার কারণে ডিলিট ব্যর্থ হবে কিনা তা পরীক্ষা করার কোনও উপায় আছে?


10

আমি মুছে ফেলতে না পারলে প্রকৃতপক্ষে মুছে ফেলা ব্যতিরেকে কোনও মুছে ফেলা বাধা লঙ্ঘনের ক্ষেত্রে চালিত হবে কিনা তা আমি ভবিষ্যদ্বাণী করতে সক্ষম হতে চাই।

এটি করার জন্য আমার বিকল্পগুলি কী কী? মুছে ফেলার "শুকনো রান" করার কি কোনও সহজ উপায় আছে?


আপনি কি এই বিবৃতিটির ব্যতিক্রমকে একা আটকাতে চাইছেন, বা আপনি মুছে ফেলা এমন বৃহত্তর ব্যাচে ত্রুটি পরিচালনা করার বিষয়টি সহজ করার চেষ্টা করছেন?
অ্যারন বারট্রান্ড

3
আপনি কোনও এফকে বিদ্যমান কিনা তা পরীক্ষা করে দেখতে পারেন, এবং মানগুলি পরীক্ষা করতে একটি নির্বাচন বিবৃতি চালান?
এসকিউএলরকস্টার

হারুন: আমাদের আলাদা লেনদেনের জন্য বেশ কয়েকটি ডিএলটিইটির একটি ব্যাচ চালানো দরকার। যদি কেউ ব্যর্থ হয় তবে অন্যরা ইতিমধ্যে প্রতিশ্রুতিবদ্ধ। (শুরু থেকেই খারাপ ডিজাইন, আমি জানি, তবে এটি আমার প্রয়োগ নয়, এবং এটি পরিবর্তন হচ্ছে না)) এই মুহুর্তে সেরা কাজটি হ'ল ডিলেটগুলি ব্যর্থ হবে কিনা তা দেখার জন্য একটি শুকনো চেক করার মতো মনে হচ্ছে।
জে সুলিভান

তবুও নিশ্চিত নই আমি বুঝি। আপনি কি বাকী মুছে ফেলা সফল হতে দেওয়ার চেষ্টা করছেন, বা আপনি মুছে ফেলার চেষ্টা করছেন যে মুছে ফেলা সমস্তই সফল হবে, বা তাদের কোনওটিরই উচিত নয়?
অ্যারন বার্ট্র্যান্ড

হারুন: দুঃখিত আমি এটি পরিষ্কার করে দেখিনি, তবে হ্যাঁ, আমি নিশ্চিত হয়ে চেষ্টা করছি যে তারা সবাই সফল হয় বা তাদের কেউই সফল হয় না।
জে সুলিভান

উত্তর:


24

যদি আপনার লক্ষ্যটি হ'ল সমস্ত মুছে ফেলা কেবলমাত্র সেগুলি সফল হয় তবে কেন কেবল ট্রাই / ক্যাচ ব্যবহার করবেন না:

BEGIN TRANSACTION;
BEGIN TRY
  DELETE #1;
  DELETE #2;
  DELETE #3;
  COMMIT TRANSACTION;
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION;
END CATCH

এক বা একাধিক ব্যর্থ হওয়া সত্ত্বেও যদি লক্ষ্যটি সমস্ত সফল মুছে ফেলা সফল হওয়ার অনুমতি দেয় তবে আপনি স্বতন্ত্র ট্রাই / ক্যাচ ব্যবহার করতে পারেন, যেমন

BEGIN TRY
  DELETE #1;
END TRY
BEGIN CATCH
  PRINT 1;
END CATCH

BEGIN TRY
  DELETE #2;
END TRY
BEGIN CATCH
  PRINT 1;
END CATCH

6

একটি বিকল্প হ'ল লেনদেন শুরু করা, আপনার মোছা চালানো এবং তারপরে সর্বদা রোলব্যাক করুন:

begin tran

delete Table1 where col1 = 1

-- Test whether it is there
select * from Table1 where col1 = 1

rollback tran

-- Confirm that it is still there
select * from Table1 where col1 = 1

1
এবং যদি মুছা সফল হয়, আবার চালাবেন? মুছে ফেললে খুব ব্যয় হয় তো? এবং যদি মুছতে ব্যর্থ হয়, তবে কি? আপনি একটি মুছুন এবং দুটি নির্বাচন করেছেন। আমি কীভাবে পরবর্তী মুছতে বা না সরানোর সিদ্ধান্ত নেব?
অ্যারন বারট্রান্ড

1
সেগুলি যদি প্রয়োজনীয়তার অংশ হয় তবে তাদের পরিচালনা করা উচিত। এই উত্তরটি একটি "সাধারণ 'শুকনো রান'" সম্পর্কিত।
গাটেক থমাস

আপনি যখন আপনার উত্তরটি প্রথম জমা দিয়েছিলেন তখন সেগুলি ছিল না, তবে তাদের এখনই স্পষ্ট করা হয়েছে।
অ্যারন বারট্রান্ড

4
@ গ্যাটাথ থমাস অ্যারন প্রচুর অবদান রাখেন, তাই তিনি মাঝে মাঝে সংক্ষিপ্তও হন তবে আমি নিশ্চিত যে তাঁর উদ্দেশ্যটি আক্রমণাত্মক হবে না। আমি এটি দ্য হিপ- এ আলোচনা করেছি এবং আমি আপনার সাথেও এটি করার সুযোগের জন্য কৃতজ্ঞ হব।
জ্যাক বলছেন টপান্সওয়ার্স.অক্সিজ

1
@ জ্যাকডুগলাস আমি হিপ মন্তব্যগুলি পড়েছি যা আপনি উল্লেখ করেছেন এবং বিষয়টিটি বোঝেন। সম্প্রদায়ের মন্তব্যগুলি সেই অংশ ব্যতীত যুক্তিসঙ্গত ছিল যেখানে তার আগ্রাসন দেখানোর জন্য আমাকে ক্লাউন বলা হয়েছিল। আমি যে একজনকে আক্রমণাত্মক হিসাবে দেখা হয়েছিল তা আমি কীভাবে বুঝতে পারি না। আমি প্রশ্নটির বৈধ উত্তর পোস্ট করেছি কারণ সেসময় এটি উত্থাপিত হয়েছিল। এটি উত্পাদন মানের জন্য জিজ্ঞাসা করে না - কখনও কখনও আপনার কেবল দ্রুত এবং সহজ প্রয়োজন। সুতরাং আমার উত্তর আমি পয়েন্ট প্রশ্ন পেতে। চেহারাটি হ'ল তিনি আমার উত্তরটিকে অস্বীকার করছেন যাতে তাঁর বাছাই করা যায়। আমাদের এই থ্রেডটি অন্য কোথাও নেওয়া উচিত?
গাটেক থমাস

0

আমি কিছু কোড দিয়ে অ্যারন বার্ট্র্যান্ডের সরবরাহিত সমাধানটি উন্নত করতে চাই, আপনি যদি কোনও টেবিলের কোনও উপাদান যুক্ত করার চেষ্টা করতে চান তবে ব্যর্থতা উপেক্ষা করতে ব্যতিক্রমগুলি পরিচালনা করতে বা প্রক্রিয়াটির ত্রুটিগুলি বন্ধ করে দিতে।

এটি একটি টেবিল থেকে রেকর্ড নির্বাচন করবে এবং তারপরে ব্যতিক্রম ছাড়াই সেগুলি মুছতে চেষ্টা করবে:

DECLARE @MaxErrors INT
SET @MaxErrors = 5;    // Setting 0 will stop process after the first error!

SELECT
    [Id]
    , ROW_NUMBER() OVER (ORDER BY Id ASC) AS [Index]
INTO #DeletingItems
FROM myTable

DECLARE @Current INT, @Max INT, @Id INT, @TotErrors INT
SELECT
    @Current = 1
    , @TotErrors = 0
    , @Max = MAX([Index])
FROM #DeletingTable

WHILE @Current <= @Max
BEGIN
    SELECT
        @Id = [Id]
    FROM #DeletingItems
    WHERE
        [Index] = @Index;

    BEGIN TRANSACTION;    
    BEGIN TRY    
        DELETE FROM myTable WHERE [Id] = @Id;

        COMMIT TRANSACTION;    
    END TRY    
    BEGIN CATCH    
        ROLLBACK TRANSACTION;

        SET @TotErrors = @TotErrors + 1;

        IF @TotErrors > @MaxErrors
            BREAK;
    END CATCH

    SET @Current = @Current + 1;
END

1
কেন? এটি কীভাবে গৃহীত উত্তরের চেয়ে উন্নতি?
টুলমেকারস্টেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.