Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

मेरे पास एक ट्रिगर स्वायत्त है लेकिन उसी सत्र में केवल एक बार निष्पादित करें

आप इस तथ्य के इर्द-गिर्द काम करने के लिए एक स्वायत्त लेनदेन का उपयोग कर रहे हैं कि एक ट्रिगर अपनी तालिका से ही नहीं पूछ सकता है। आप कुख्यात उत्परिवर्तन तालिका त्रुटि में चले गए हैं और आपने पाया है कि ट्रिगर को एक स्वायत्त लेनदेन के रूप में घोषित करने से त्रुटि दूर हो जाती है।

हालांकि आपके लिए कोई भाग्य नहीं है, यह समस्या का समाधान बिल्कुल नहीं करता है:

  • सबसे पहले, कोई भी लेन-देन तर्क खो जाता है। आप suscription_fact . पर परिवर्तनों को वापस नहीं ले सकते तालिका, वे प्रतिबद्ध . हैं , जबकि आपका मुख्य लेन-देन नहीं है और इसे वापस लाया जा सकता है। तो आपने अपना डेटा अखंडता भी खो दिया है।
  • ट्रिगर नई पंक्ति नहीं देख सकता क्योंकि नई पंक्ति अभी तक प्रतिबद्ध नहीं है! चूंकि ट्रिगर एक स्वतंत्र लेनदेन में चलता है, यह मुख्य लेनदेन द्वारा किए गए अप्रतिबद्ध परिवर्तनों को नहीं देख सकता है:आप पूरी तरह से गलत परिणामों में भाग लेंगे।

यही कारण है कि आपको स्वायत्त लेनदेन में कभी भी कोई व्यावसायिक तर्क नहीं करना चाहिए। (वैध अनुप्रयोग हैं लेकिन वे लगभग पूरी तरह से लॉगिंग/डिबगिंग तक ही सीमित हैं)।

आपके मामले में आपको या तो:

  1. अपना तर्क अपडेट करें ताकि उसे आपकी तालिका को क्वेरी करने की आवश्यकता न हो (अपडेट करना suscription_fact केवल तभी जब नई पंक्ति id_date_unsuscription . में संग्रहीत पुराने मान से अधिक नवीनतम हो )।
  2. ट्रिगर में व्यावसायिक तर्क का उपयोग करने के बारे में भूल जाओ और एक ऐसी प्रक्रिया का उपयोग करें जो सभी तालिकाओं को सही ढंग से अपडेट करती है या एक दृश्य का उपयोग करती है क्योंकि यहां हमारे पास अनावश्यक डेटा का एक स्पष्ट मामला है।
  3. एक ऐसे समाधान का उपयोग करें जो वास्तव में काम करता हो (टॉम कायटे द्वारा)

मैं यहां (2) का उपयोग करने की दृढ़ता से सलाह दूंगा। व्यावसायिक तर्क को कोड करने के लिए ट्रिगर्स का उपयोग न करें। उन्हें बग के बिना लिखना कठिन है और बनाए रखना अभी भी कठिन है। एक प्रक्रिया का उपयोग करना गारंटी देता है कि सभी प्रासंगिक कोड एक ही स्थान (एक पैकेज या एक प्रक्रिया) में समूहीकृत हैं, पढ़ने में आसान और पालन करने और अप्रत्याशित परिणामों के बिना।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle का उपयोग करके INTO का चयन करें

  2. कथन का चयन करें REF oracle

  3. Oracle DELETE प्रदर्शन को बेहतर बनाने की रणनीति

  4. बड़ी संख्या में पंक्तियों को छोटे प्रश्नों में तोड़ना? समानता

  5. Oracle क्लाइंट लाइब्रेरी को लोड करने का प्रयास BadImageFormatException को फेंक देता है