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 स्टेटमेंट जोड़ा है, क्योंकि वे एक अलग श्रेणी के अंतर्गत आते हैं।

0
nick zoum 12 फरवरी 2019, 18:08

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 है।

1
Zohar Peled 22 फरवरी 2019, 07:52