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

Oracle - ट्रिगर बनाने में समस्या जो किसी अन्य तालिका को अद्यतन करता है

कुछ मुद्दे बिना किसी विशेष क्रम के।

सबसे पहले, पंक्ति-स्तरीय ट्रिगर के मुख्य भाग में, आपको :new . का उपयोग करने की आवश्यकता है और :old नए और पुराने रिकॉर्ड को संदर्भित करने के लिए। अग्रणी बृहदान्त्र आवश्यक है। तो आपका WHERE खंड होना चाहिए

WHERE PROJECTID = :new.PROJECTID

दूसरा, यदि आप अपना CREATE TRIGGER . चला रहे हैं SQL*प्लस में, आप SHOW ERRORS का उपयोग करके त्रुटियों और चेतावनियों की एक सूची प्राप्त कर सकते हैं कमांड, यानी

SQL> show errors

आप DBA_ERRORS से भी पूछ सकते हैं तालिका (या ALL_ERRORS या USER_ERRORS आपके विशेषाधिकार स्तर के आधार पर) लेकिन ऐसा कुछ नहीं है जिसका आपको सामान्य रूप से सहारा लेना पड़ता है।

तीसरा, यह मानते हुए कि सिंटैक्स त्रुटियां ठीक हो जाती हैं, आपको एक म्यूटेटिंग मिलने वाला है। तालिका त्रुटि यदि आप इस तर्क का उपयोग करते हैं। तालिका A पर एक पंक्ति स्तरीय ट्रिगर (TPM_TRAININGPLAN इस स्थिति में) तालिका A को क्वेरी नहीं कर सकता क्योंकि तालिका असंगत स्थिति में हो सकती है। आप उसके आसपास काम कर सकते हैं, जैसा कि टिम अपने लेख में दिखाता है, एक संग्रह के साथ एक पैकेज बनाकर, उस संग्रह को पहले के बयान ट्रिगर में शुरू करके, एक पंक्ति-स्तरीय ट्रिगर में संग्रह में डेटा को पॉप्युलेट करना, और फिर संशोधित पंक्तियों को संसाधित करना एक बयान के बाद ट्रिगर। हालाँकि, सिस्टम में जोड़ने के लिए यह एक अच्छी मात्रा में जटिलता है, हालाँकि, आपको कई अलग-अलग वस्तुओं का प्रबंधन करना होगा।

आम तौर पर, आप TPM_TRAININGPLAN में हेरफेर करने के लिए उपयोग किए जाने वाले किसी भी API के हिस्से के रूप में इस तर्क को लागू करने से बेहतर होंगे मेज़। यदि वह एक संग्रहीत कार्यविधि है, तो तर्क को अद्यतन करने के लिए TPM_PROJECT रखना अधिक उचित है। उस संग्रहीत प्रक्रिया में इसे ट्रिगर में डालने के बजाय। किसी ऐसे एप्लिकेशन को डीबग करने का प्रयास करना बेहद दर्दनाक है जिसमें ट्रिगर्स में बहुत सारे तर्क अंतर्निहित हैं क्योंकि इससे डेवलपर्स के लिए यह पता लगाना बहुत मुश्किल हो जाता है कि वास्तव में कौन से ऑपरेशन किए जा रहे हैं। वैकल्पिक रूप से, आप TRAININGDELIVERYSTART . को हटा सकते हैं TPM_PROJECT . से कॉलम तालिका और रनटाइम पर न्यूनतम प्रारंभ तिथि की गणना करें।

चौथा, यदि आपका ट्रिगर इंसर्ट, अपडेट और डिलीट पर सक्रिय होता है, तो आप केवल :new का संदर्भ नहीं दे सकते। मूल्य। :new इंसर्ट और अपडेट के लिए मान्य है लेकिन अगर आप डिलीट कर रहे हैं तो यह NULL होने वाला है। :old डिलीट और अपडेट के लिए मान्य है लेकिन यदि आप एक इंसर्ट कर रहे हैं तो NULL होने वाला है। इसका मतलब है कि आपको संभवतः तर्क की आवश्यकता है (टिम के पैकेज समाधान का संदर्भ देते हुए)

BEGIN
  IF inserting 
  THEN
    trigger_api.tab1_row_change(p_id => :new.projectid, p_action => 'INSERT');
  ELSIF updating
  THEN
    trigger_api.tab1_row_change(p_id => :new.projectid, p_action => 'UPDATE');
  ELSIF deleting
  THEN
    trigger_api.tab1_row_change(p_id => :old.projectid, p_action => 'DELETE');
  END IF;
END;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जेडीबीसी में बाध्य चर निष्पादन के साथ एसक्यूएल क्वेरी

  2. ORA-00907:दायां कोष्ठक गुम है

  3. चयन संघ के साथ तालिका बनाएं कोई बाधा नहीं है

  4. पीएल/एसक्यूएल में अगर स्टेटमेंट कंडीशन में स्केलर सबक्वेरी

  5. Oracle में समय क्षेत्र बदलने के 4 तरीके