एसक्यूएल सर्वर: पुराने रिकॉर्ड अक्षम करने के लिए ट्रिगर अद्यतन - एकल पंक्ति अद्यतन काम करता है, एकाधिक विफल रहता है - एसक्यूएल, एसक्यूएल-सर्वर, ट्रिगर्स

निम्न SQL एक पंक्ति अद्यतनों के लिए ठीक काम कर रहा है, लेकिन कई पंक्ति अद्यतनों पर विफल रहता है:

CREATE TRIGGER update_fix
ON mytable
FOR UPDATE AS
BEGIN
SET NOCOUNT ON;

IF (SELECT f_month FROM inserted) = 99
AND (SELECT x_date FROM mytable
WHERE data_id IN ((SELECT data_id FROM inserted)))<= DateAdd(yy, -2, GetDate())
BEGIN
RAISERROR("Cannot update old records",16,1)
ROLLBACK TRANSACTION
RETURN;
END
END
GO

क्या कोई मुझे काम करने के लिए ट्रिगर बदलने में मदद कर सकता हैकई पंक्तियों को प्रभावित करने वाले अपडेट के लिए? अलग से अद्यतन की जाने वाली प्रत्येक पंक्ति की जाँच करनी चाहिए - इसलिए यदि 10 पंक्तियों का अद्यतन है जहाँ उनमें से एक को अद्यतन नहीं किया जाना चाहिए - बस यह कि एक को अद्यतन नहीं किया जाएगा, तो अन्य पंक्तियों को सफलतापूर्वक अपडेट किया जाएगा..यदि जो ट्रिगर के साथ भी संभव है ध्यान में रखते हुए, मैं प्रश्नों को अपने आप में बड़ी प्रणाली से इन उत्पत्ति को पुनर्परिभाषित नहीं कर सकता हूं और इस तरह का परिवर्तन दायरे से बाहर होगा)? मुझे चिंता है कि एक क्वेरी = एक लेनदेन..है। सभी वापस लुढ़का जा सकता है, या सभी कमिट किए जा सकते हैं, लेकिन .. शायद यह संभव है ..?

उत्तर:

जवाब के लिए 0 № 1

एक का प्रयोग करें INSTEAD OF ट्रिगर।

प्रदर्शन करो UPDATE ट्रिगर में, और एक जोड़ें WHERE अद्यतन करने के लिए शर्त यह है कि केवल पंक्तियाँ जो नए पर्याप्त हैं अद्यतन हो।

फिर आप उन पंक्तियों का उपयोग कर सकते हैं जो आप उन पंक्तियों की पंक्तिबद्धता को प्राप्त करना पसंद करते हैं जो अद्यतन नहीं की गई थीं, और उपयोग करें RAISERROR एक संदेश भेजने के लिए जैसे "5 पंक्तियों को उम्र के कारण अद्यतन नहीं किया गया था" या आप जो भी चाहते हैं।

फिर लेन-देन को पूरी तरह से रोलबैक करने की आवश्यकता नहीं है।


जवाब के लिए 0 № 2

बेशक यह विफल हो जाता है। आपके पास है = एक उपश्रेणी के लिए जो एक से अधिक परिणाम दे सकता है।

The if इस तरह कुछ दिखना चाहिए:

if (exists (select 1 from inserted where f_month = 99) and
exists (select 1
from mytable
where data_id in (select data_id from inserted) and
x_date <= dateadd(year, -2, getdate())
)
)

मैं नहीं हूं १००% यकीन है कि यह एक ही तर्क है, क्योंकि दो शर्तों अलग रिकॉर्ड पर हो सकता है ।यह स्पष्ट नहीं है कि आप जो सटीक शर्तें चाहते हैं ।

यदि दोनों शर्तों को एक ही रिकॉर्ड पर करने की आवश्यकता है, तो:

if (exists (select 1
from mytable
where data_id in (select data_id from inserted where f_month = 99) and
x_date <= dateadd(year, -2, getdate())
)
)

संबंधित सवाल
सबसे लोकप्रिय