এসকিউএল সার্ভারের পরে প্রবেশের ট্রিগার


10

আমি চাই পর সন্নিবেশ টেক্সট দিয়ে তৈরি করা হয় এই ট্রিগার বহিস্কার করা marriedউপর marital_statusকলাম, এই কি আমি এতদূর আছে

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF (SELECT [marital_status] FROM inserted) = 'married'
 BEGIN
     INSERT INTO [dbo].[applicant_marriage_info]([dom])
     VALUES('abc')
 END
END

উত্তর:


11

আপনি এখানে যে সমস্যাটি চালাবেন তা এ থেকে আসে যে এসকিউএল সার্ভারের কাছে "প্রতিটি প্রতিরোধের জন্য" ট্রিগার নেই যা ওরাকল করে। মাল্টি-সারি পরিবর্তনগুলি হ্যান্ডেল করতে আপনাকে আপনার ট্রিগারগুলি লিখতে হবে, যেমন সন্নিবেশিত বা মোছা ভার্চুয়াল টেবিলগুলিতে সেগুলির মধ্যে একাধিক সারি থাকতে পারে।

যদি এই জাতীয় আপডেটটি ঘটে থাকে তবে আপনার (SELECT [marital_status] FROM inserted)ট্রিগারটি ব্যর্থ হবে, যেহেতু একাধিক সারি ফিরে আসবে, এবং সাবকিউরিগুলিকে সরাসরি তুলনা করতে ব্যবহার করার জন্য একটি একক মান ফেরত দিতে হবে।

ট্রিগারটি সম্ভবত এর মতো কিছু দেখতে হবে:

CREATE TRIGGER [dbo].[marriage] ON  [dbo].[applicant_personal_info] FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON
    IF EXISTS (SELECT [marital_status] FROM INSERTED WHERE marital_status = 'married')
    BEGIN
        INSERT INTO [dbo].[applicant_marriage_info] ([dom])
        SELECT
            'abc' --Replace with whatever you're really inserting
        FROM INSERTED
        WHERE marital_status = 'married'
    END
END

8

সুতরাং এই ট্রিগারটি আপনার যা প্রয়োজন তা খুব কাছে। এখন এখানে সমস্যাটি হ'ল কেবলমাত্র একটি সারি .োকানো হবে আবেদনকারী_মার্য_ইনফোতে যদি কোনও সারি inোকানো থাকে তবে। আপনি কি আসলে এটি চান? যদি এক সাথে একাধিক সারি sertedোকানো হয় তবে কী হবে?

ALTER TRIGGER [dbo].[marriage]
ON  [dbo].[applicant_personal_info]
AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    INSERT INTO [dbo].[applicant_marriage_info]([dom])
    SELECT 'abc' 
    FROM inserted 
    WHERE marital_status = 'married'
END

আমি যা দেখিয়েছি তার চেয়ে বেশি কলাম আপনার প্রয়োজন হবে।


প্রতিবার এই ডেটা প্রবেশ করার সময় এটি করা উচিত
kabuto178

2
তারপরে একটি উপায় হ'ল শেষ অংশটিBEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) SELECT 'abc' FROM inserted WHERE marital_status = 'married' END
ypercubeᵀᴹ

আমি এই অ্যাকাউন্টে নমুনা কোডটি কিছুটা পরিবর্তন করেছি। আপনার আর আর কিছু উপস্থিত না থাকলে দরকার নেই। সন্নিবেশের বিরুদ্ধে কেবল ক্যোরি চালান এবং অন্যান্য টেবিলে সেই ডেটা লোড করুন। আমি দেখানোর চেয়ে সম্ভবত আপনার আরও কলামের প্রয়োজন হবে, সম্ভবত একরকম আইডি, তবে আপনি সম্ভবত ধারণাটি পেয়ে যান।
mrdenny
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.