SQL सर्वर INSERT ट्रिगर के बाद


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

आप जिस मुद्दे पर चलेंगे, वह इस तथ्य से आता है कि SQL सर्वर में "FOR RACH ROW" नहीं है जो कि Oracle करता है। बहु-पंक्ति परिवर्तनों को संभालने के लिए आपको अपने ट्रिगर को लिखना होगा, अर्थात INSERTED या DELETED वर्चुअल टेबल में एक से अधिक पंक्ति हो सकती हैं।

यदि ऐसा कोई अद्यतन होने को था, तो आपका ट्रिगर विफल हो जाएगा, क्योंकि (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

तो यह ट्रिगर वास्तव में आपकी जरूरत के काफी करीब है। अब यहाँ समस्या यह है कि यदि कोई पंक्तियाँ सम्मिलित हैं, तो केवल एक पंक्ति को आवेदक_अमेरिका_इन्फो में डाला जाएगा। यह वही है जो आप वास्तव में चाहते हैं? यदि एक ही बार में कई पंक्तियाँ डाली जाएँ तो क्या होगा?

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

मैंने इसके लिए नमूना कोड को थोड़ा बदल दिया है। आपको IF EXISTS बिट की आवश्यकता नहीं है। बस सम्मिलित डेटा के विरुद्ध क्वेरी चलाएँ और उस डेटा को अन्य तालिका में लोड करें। आपको संभवतः मेरे द्वारा दिखाए गए आइडी, किसी प्रकार की तुलना में अधिक कॉलम की आवश्यकता होगी, लेकिन आपको शायद यह विचार मिल जाएगा।
मन्दिनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.