आप इस तथ्य के इर्द-गिर्द काम करने के लिए एक स्वायत्त लेनदेन का उपयोग कर रहे हैं कि एक ट्रिगर अपनी तालिका से ही नहीं पूछ सकता है। आप कुख्यात उत्परिवर्तन तालिका त्रुटि में चले गए हैं और आपने पाया है कि ट्रिगर को एक स्वायत्त लेनदेन के रूप में घोषित करने से त्रुटि दूर हो जाती है।
हालांकि आपके लिए कोई भाग्य नहीं है, यह समस्या का समाधान बिल्कुल नहीं करता है:
- सबसे पहले, कोई भी लेन-देन तर्क खो जाता है। आप
suscription_fact
. पर परिवर्तनों को वापस नहीं ले सकते तालिका, वे प्रतिबद्ध . हैं , जबकि आपका मुख्य लेन-देन नहीं है और इसे वापस लाया जा सकता है। तो आपने अपना डेटा अखंडता भी खो दिया है। - ट्रिगर नई पंक्ति नहीं देख सकता क्योंकि नई पंक्ति अभी तक प्रतिबद्ध नहीं है! चूंकि ट्रिगर एक स्वतंत्र लेनदेन में चलता है, यह मुख्य लेनदेन द्वारा किए गए अप्रतिबद्ध परिवर्तनों को नहीं देख सकता है:आप पूरी तरह से गलत परिणामों में भाग लेंगे।
यही कारण है कि आपको स्वायत्त लेनदेन में कभी भी कोई व्यावसायिक तर्क नहीं करना चाहिए। (वैध अनुप्रयोग हैं लेकिन वे लगभग पूरी तरह से लॉगिंग/डिबगिंग तक ही सीमित हैं)।
आपके मामले में आपको या तो:
- अपना तर्क अपडेट करें ताकि उसे आपकी तालिका को क्वेरी करने की आवश्यकता न हो (अपडेट करना
suscription_fact
केवल तभी जब नई पंक्तिid_date_unsuscription
. में संग्रहीत पुराने मान से अधिक नवीनतम हो )। - ट्रिगर में व्यावसायिक तर्क का उपयोग करने के बारे में भूल जाओ और एक ऐसी प्रक्रिया का उपयोग करें जो सभी तालिकाओं को सही ढंग से अपडेट करती है या एक दृश्य का उपयोग करती है क्योंकि यहां हमारे पास अनावश्यक डेटा का एक स्पष्ट मामला है।
- एक ऐसे समाधान का उपयोग करें जो वास्तव में काम करता हो (टॉम कायटे द्वारा)ए> ।
मैं यहां (2) का उपयोग करने की दृढ़ता से सलाह दूंगा। व्यावसायिक तर्क को कोड करने के लिए ट्रिगर्स का उपयोग न करें। उन्हें बग के बिना लिखना कठिन है और बनाए रखना अभी भी कठिन है। एक प्रक्रिया का उपयोग करना गारंटी देता है कि सभी प्रासंगिक कोड एक ही स्थान (एक पैकेज या एक प्रक्रिया) में समूहीकृत हैं, पढ़ने में आसान और पालन करने और अप्रत्याशित परिणामों के बिना।