এসকিউএল আপডেট ট্রিগার কেবল তখন কলাম পরিবর্তন করা হয়


101

অন্যান্য উদাহরণগুলি দেখে আমি নিম্নলিখিতগুলি নিয়ে হাজির হয়েছি তবে এটি আমার মতো কাজ করবে বলে মনে হচ্ছে না: QtyToRepairমানটি আপডেট করা হলে আমি এটি কেবলমাত্র পরিবর্তিত তথ্য আপডেট করতে চাই ... তবে এটি হয় না যে।

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

ওয়াল্টার

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE SCHEDULE SET modified = GETDATE()
        , ModifiedUser = SUSER_NAME()
        , ModifiedHost = HOST_NAME()
    FROM SCHEDULE S
    INNER JOIN Inserted I on S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
    WHERE S.QtyToRepair <> I.QtyToRepair
END

8
সম্পর্কে একটি সতর্কতা update()- এটি কেবলমাত্র কলাম আপডেট তালিকায় উপস্থিত থাকলে তা পরীক্ষা করে এবং সর্বদা সন্নিবেশকারীদের জন্য সত্য। এটি কলামের মান পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে না, কারণ আপনার একাধিক সারি থাকতে পারে, যেখানে কিছু মান পরিবর্তন হয়েছে এবং কিছুতে নেই।
নিকোলা মার্কোভিনোভিও

উত্তর:


128

আপনার প্রশ্নের দুটি উপায় আছে:

1- আপনার ট্রিগারটিতে আপডেট কমান্ড ব্যবহার করুন।

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;
    IF UPDATE (QtyToRepair) 
    BEGIN
        UPDATE SCHEDULE 
        SET modified = GETDATE()
           , ModifiedUser = SUSER_NAME()
           , ModifiedHost = HOST_NAME()
        FROM SCHEDULE S INNER JOIN Inserted I 
        ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
        WHERE S.QtyToRepair <> I.QtyToRepair
    END 
END

2- sertedোকানো টেবিল এবং মুছে ফেলা টেবিলের মধ্যে যোগদান ব্যবহার করুন

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;    

    UPDATE SCHEDULE 
    SET modified = GETDATE()
       , ModifiedUser = SUSER_NAME()
       , ModifiedHost = HOST_NAME()
    FROM SCHEDULE S 
    INNER JOIN Inserted I ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
    INNER JOIN Deleted D ON S.OrderNo = D.OrderNo and S.PartNumber = D.PartNumber                  
    WHERE S.QtyToRepair <> I.QtyToRepair
    AND D.QtyToRepair <> I.QtyToRepair
END

আপনি যখন টেবিলের জন্য আপডেট কমান্ড ব্যবহার করেন SCHEDULEএবং QtyToRepairকলামটি নতুন মানে সেট করুন , যদি এক বা একাধিক সারিতে পুরানো মানের সমান নতুন মান হয় তবে 1 টি তত্কলিত সারণিতে সমস্ত আপডেট হওয়া সারি সমাধান করুন তবে সমাধান 2 আপডেট কেবলমাত্র পুরানো মানটির সমান নয় এমন সারণী সারিটি সমাধান করুন মান।


এটি এসকিউএল সার্ভার উল্লেখ না করায় দুঃখিত Sorry আমার মুছে ফেলা টেবিলটি ব্যবহার করা দরকার। আমি একটি পৃথক টেবিল (ইতিহাস বজায় রাখতে) লিখে শেষ করেছি।
ওয়াল্টার ডি জং

9
পদ্ধতির # 2 আরও ভাল, যদি আপনি না চান যে আপনার ট্রিগারটি গুলি চালিত হয় যদি কলাম একই মানতে পরিবর্তন করা হয়।
নিওলিস্ক

4
আমি মনে করি আমি কিছু অনুপস্থিত হতে পারি - তবে # 1 এ কার্যকর হবে না কারণ এটি আপডেটের পরে , সুতরাং বর্তমান সারিতে সর্বদা সন্নিবেশকরণ সারিটির সমান মান থাকবে। আপনি আপডেটের পরে যদি ব্যবহার করেন তবে আপনাকে অবশ্যই মুছে ফেলার সাথে যোগ দিতে হবে
রব

4
@ রব "আইএফ আপডেট" বিবৃতিটি এমন একটি প্রক্রিয়া আহ্বান করছে যা কোয়েরির অংশ হিসাবে আপডেট হওয়া কলামগুলির একটি কলাম তালিকার অ্যাক্সেস পেয়েছে এবং সুতরাং পূর্ববর্তী মানগুলি জানার দরকার নেই। (আমরা কেবল আমাদের পরিবেশে এটি নিয়ে ছুটে এসেছি এবং নিশ্চিত করেছি যে "
আফগান

4
insertedদ্বিতীয় কোয়েরিতে আপনি টেবিলে কেন যোগদান করবেন ? এটি টেবিলের মতোই হওয়া উচিত, তাই না?
টায়ার করুন

22

fyi কোডটি দিয়ে আমি শেষ করেছি:

IF UPDATE (QtyToRepair)
    begin
        INSERT INTO tmpQtyToRepairChanges (OrderNo, PartNumber, ModifiedDate, ModifiedUser, ModifiedHost, QtyToRepairOld, QtyToRepairNew)
        SELECT S.OrderNo, S.PartNumber, GETDATE(), SUSER_NAME(), HOST_NAME(), D.QtyToRepair, I.QtyToRepair FROM SCHEDULE S
        INNER JOIN Inserted I ON S.OrderNo = I.OrderNo and S.PartNumber = I.PartNumber
        INNER JOIN Deleted D ON S.OrderNo = D.OrderNo and S.PartNumber = D.PartNumber 
        WHERE I.QtyToRepair <> D.QtyToRepair
end

4
আমি এটি সহায়ক বলে খুঁজে পেয়েছি কারণ উপরোক্ত উত্তরের মধ্যে 2- ব্যবহারের জোড় কখনই কাজ করেনি যেখানে মাপদণ্ড WHERE S.QtyToRepair <> I.QtyToRepair AND D.QtyToRepair <> I.QtyToRepairকখনই গুলি করে না / মিলায় না কারণ প্রথম মানদণ্ডটি কখনই সত্য ছিল না - sertedোকানো টেবিলটি সর্বদা আসল সারণীর মানের সাথে মেলে। `যেখানে I. QtyToRepair <> D.QtyToRepair` ব্যবহার করা আমার জন্য চাবিকাঠি। এছাড়াও IF UPDATE (field)একাধিক ট্রিগার কাছ থেকে সাহায্য অগ্নিসংযোগ।
ফায়ারগার্ডেন

13

QtyToRepairপ্রথমে আপডেট হয়েছে কিনা তা যাচাই করা উচিত ।

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;
    IF UPDATE (QtyToRepair) 
    BEGIN
        UPDATE SCHEDULE 
        SET modified = GETDATE()
           , ModifiedUser = SUSER_NAME()
           , ModifiedHost = HOST_NAME()
        FROM SCHEDULE S INNER JOIN Inserted I 
            ON S.OrderNo = I.OrderNo and S.PartNumber =    I.PartNumber
        WHERE S.QtyToRepair <> I.QtyToRepair
    END
END

6

আপনি নিম্নলিখিতটি করতে চান:

ALTER TRIGGER [dbo].[tr_SCHEDULE_Modified]
   ON [dbo].[SCHEDULE]
   AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;

    IF (UPDATE(QtyToRepair))
    BEGIN
        UPDATE SCHEDULE SET modified = GETDATE()
            , ModifiedUser = SUSER_NAME()
            , ModifiedHost = HOST_NAME()
        FROM SCHEDULE S
        INNER JOIN Inserted I ON S.OrderNo = I.OrderNo AND S.PartNumber = I.PartNumber
        WHERE S.QtyToRepair <> I.QtyToRepair
    END
END

অনুগ্রহ করে নোট করুন যে প্রতিবার কলামটি আপডেট করা হলেও এই মানটি একই রকম হবে কিনা তা এই ট্রিগারটি চালু হবে।


2

যখনই কোনও রেকর্ড আপডেট হয়েছে একটি রেকর্ড "মুছে ফেলা হয়েছে"। এখানে আমার উদাহরণ:

ALTER TRIGGER [dbo].[UpdatePhyDate]
   ON  [dbo].[M_ContractDT1]
   AFTER UPDATE
AS 
BEGIN
    -- on ContarctDT1 PhyQty is updated 
    -- I want system date in Phytate automatically saved
    SET NOCOUNT ON;

    declare @dt1ky as int   

    if(update(Phyqty))
    begin
        select @dt1ky = dt1ky from deleted

        update M_ContractDT1 set PhyDate=GETDATE() where Dt1Ky=  @dt1ky     

    end

END

এটা ভাল কাজ করে

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