Update Trigger
में सभी संशोधित क्षेत्रों की सूची प्राप्त करने का सबसे आसान तरीका क्या होगा?
मैं जिस सबसे कॉम्पैक्ट तरीके के बारे में सोच सकता था, वह था कुछ इस प्रकार का:
IF EXISTS(SELECT 1 FROM INSERTED INNER JOIN DELETED ON INSERTED.[FIELD_TO_CHECK] = DELETE.[FIELD_TO_CHECK])
लेकिन इसका मतलब यह होगा कि मुझे यह हर उस क्षेत्र के लिए करना होगा जिसकी मैं जांच करना चाहता हूं। मैं सभी संशोधित क्षेत्रों के बारे में जानकारी युक्त cursor
के साथ एक दृष्टिकोण की सराहना करता हूं।
(इसे बड़े पैमाने पर अपडेट के लिए काम करने की आवश्यकता नहीं है, INSERTED
या DELETED
में 1 से अधिक रिकॉर्ड की अपेक्षा करने की आवश्यकता नहीं है)
बड़े पैमाने पर अपडेट को अनदेखा करने के लिए मैंने एक if स्टेटमेंट जोड़ा है, क्योंकि वे एक अलग श्रेणी के अंतर्गत आते हैं।
1 उत्तर
दुर्भाग्य से मुझे किसी भी विश्वसनीय अंतर्निहित फ़ंक्शन के बारे में पता नहीं है जो आपको एक संकेत दे सकता है कि क्या एक कॉलम का मान वास्तव में बदल गया है जब एक अपडेट स्टेटमेंट ने ट्रिगर को निकाल दिया।
हालाँकि, बहुत ही सरल चयन कथन है जिसे आप यह देखने के लिए निष्पादित कर सकते हैं कि किन पंक्तियों में कौन से मान बदल गए हैं:
SELECT IIF(ISNULL(NULLIF(I.Col, D.Col), NULLIF(D.Col, I.Col)) IS NULL, 0, 1) As Col_Updated
FROM Inserted I
JOIN Deleted D
ON I.PrimaryKey = D.PrimaryKey
यदि दोनों कॉलम बराबर हैं तो NULLIF
फ़ंक्शन null
वापस आ जाएगा। यदि नहीं, तो यह पहले कॉलम का मान लौटाता है।
ISNULL
फ़ंक्शन पहला तर्क लौटाएगा जो null
नहीं है, या null
यदि दोनों तर्क शून्य हैं।
दो NULLIF
फ़ंक्शंस के परिणाम पर ISNULL
का उपयोग करना जहां कॉलम मान उलट दिए गए हैं, परिणाम null
होगा यदि दोनों कॉलम के मान समान हैं, भले ही वे दोनों शून्य हों। यदि मान भिन्न हैं, भले ही उनमें से एक शून्य है और दूसरा नहीं है, तो ISNULL
एक मान लौटाएगा। इसलिए, आपको केवल यह जांचना है कि क्या ISNULL
ने कोई मान लौटाया है या शून्य - यदि यह null
लौटाता है, तो आप जानते हैं कि स्तंभ का मान नहीं बदला गया था। यदि यह एक मान लौटाता है, तो इसे बदल दिया जाता है।
बेशक, गैर-अशक्त स्तंभों के लिए आप इस तरह की स्थिति को सरल बना सकते हैं:
SELECT IIF(I.Col <> D.Col, 1, 0) As Col_Updated
FROM...
हालांकि, मैं विरुद्ध की अनुशंसा करता हूं, क्योंकि यदि कोई व्यक्ति नल को अनुमति देने के लिए कॉलम को बदल देगा, तो ट्रिगर कोड को इसका समर्थन करने के लिए बदलना होगा - और मेरे अनुभव में, यह एक बग होने की प्रतीक्षा कर रहा है - ट्रिगर कोड शायद बदला नहीं जाएगा, जिससे झूठे-नकारात्मक हो जाएंगे।
आप रेक्सटेस्टर पर लाइव डेमो देख सकते हैं।
अपडेट करें
एक और सरल विधि जिसका आप उपयोग कर सकते हैं वह यह है:
IIF((I.Col IS NULL AND D.Col IS NULL) OR (I.Col = D.Col), 0, 1) as IsUpdated.
यह विधि इस तथ्य पर निर्भर करती है कि किसी भी चीज़ से अशक्त की तुलना करने पर परिणाम unknown
होगा जो मूल रूप से false
के बराबर है।
यह थोड़ा और पठनीय IMHO है।
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।