कुछ मुद्दे बिना किसी विशेष क्रम के।
सबसे पहले, पंक्ति-स्तरीय ट्रिगर के मुख्य भाग में, आपको :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;