2013-07-16 8 views
6

मैं निम्नलिखित MySQL ट्रिगरअद्यतन बयान के बाद MySQL ट्रिगर में पुराने मूल्य प्राप्त

SET @iUserId = OLD.LastChangedBy; 

IF NOT NEW.LastChangedBy <=> OLD.LastChangedBy THEN 
    SET @iUserId = NEW.LastChangedBy; 
END IF; 

IF NOT NEW.BookingId<=> OLD.BookingId THEN 
    INSERT INTO AuditTrail VALUES (UUID(),@iUserId,'UPDATE','Booking', OLD.BookingId,'BookingType ',OLD.BookingType ,NEW.BookingType ,NOW()); 
END IF; 

यह प्रत्येक पंक्ति के लिए बुकिंग पर अद्यतन करने के बाद TRIGGER Booking_AUPD बनाएँ के रूप में कहा जाता है की है

समस्या मैं कैसे कर सकता है मुझे अद्यतन ट्रिगर के बाद OLD फ़ील्ड मान मिलता है?

+0

यह स्पष्ट नहीं है कि आप क्या पूछ रहे हैं। कॉलम के मानों को संदर्भित करने के लिए, जैसा कि वे UPDATE से पहले थे, अद्यतन ट्रिगर के बाद, संदर्भ 'OLD.col_name', जैसा कि आपका नमूना कोड' OLD.LastChangedBy ', 'OLD.BookingID' के संदर्भों के साथ कर रहा है। , और अन्य। – spencer7593

+0

हां ठीक है। मैं फ़ील्ड बुकिंग टाइप फ़ील्ड अपडेट करता हूं, और मुझे अपडेट ट्रिगर के बाद बुकिंग प्रकार के OLD मान प्राप्त करने की आवश्यकता है। क्या यह संभव है ? – Tommassiov

+0

हां, आपके ट्रिगर बॉडी में 'OLD.BookingType' का संदर्भ पंक्ति के लिए 'बुकिंग प्रकार' कॉलम का मान वापस कर देगा जैसा कि अपडेट स्टेटमेंट निष्पादित होने से पहले था। यह संदर्भ INSERT कथन के मान खंड में है। (मुझे अभी भी यह समझना नहीं चाहिए कि आप क्या पूछ रहे हैं। हम ध्यान देते हैं कि INSERT केवल तभी निष्पादित किया जाएगा जब BookingId कॉलम के नए और OLD मान अलग हैं।) – spencer7593

उत्तर

11

एक त्रुटि

"There is no OLD row in on INSERT trigger" 

प्राप्त करने के लिए सबसे अधिक संभावना व्याख्या यह है कि आप एक बयान है कि एक AFTER INSERT ट्रिगर बनाते है, बल्कि एक AFTER UPDATE ट्रिगर बनाने की तुलना में क्रियान्वित कर रहे हैं।

कारण है कि आप पंक्ति से OLD मानों का संदर्भ नहीं दे सकते हैं, क्योंकि पंक्ति INSERT से पहले मौजूद थी, यह है कि पंक्ति INSERT से पहले मौजूद नहीं थी।

7

UPDATE TRIGGER में, आप OLD कीवर्ड का उपयोग कर सकते हैं जो पंक्ति डेटा तक पहुंचने के लिए उपयोग किया जा रहा है। NEW कीवर्ड आने वाली पंक्ति डेटा तक पहुंचने की अनुमति देता है जो सफल होने पर पुरानी पंक्ति को प्रतिस्थापित करेगा।

एक UPDATE ट्रिगर का एक उदाहरण है:

CREATE TRIGGER upd_check AFTER UPDATE ON SomeTable 
    FOR EACH ROW 
    BEGIN 
     IF (OLD.LastChangedBy <> NEW.LastChangedBy) THEN 
     INSERT INTO AuditSomeTable(ID, LastChangedBy) 
     VALUES (OLD.ID, OLD.LastChangedBy); 
     END IF; 
    END; 

यहाँ

SQLFiddle बनाया गया ट्रिगर के प्रकार पर निर्भर करता है, OLD और NEW पंक्तियों आप के लिए उपलब्ध नहीं हो सकता है:

INSERT TRIGGER

  • NEW छद्म पंक्तियों तक पहुंच केवल।

अपडेट लागू करने

  • NEW और OLD छद्म पंक्तियों

हटाएँ ट्रिगर करने के लिए पहुँच

  • केवलतक पहुंचछद्म पंक्तियों

यानी वहां एक INSERT ट्रिगर पर कोई OLD पंक्ति, और एक DELETE ट्रिगर पर कोई NEW पंक्ति है।

ओपी के प्रश्न

ओपी वास्तविक कोड, और त्रुटि संदेश टिप्पणी में करने के लिए भेजा प्रदान नहीं की है:

वहाँ सम्मिलित करें ट्रिगर पर में कोई पुरानी पंक्ति है

इंगित करता है कि ओपी ने अनजाने में INSERT TRIGGER बनाया था और UPDATE TRIGGER नहीं था जैसा कि प्रश्न में इंगित किया गया था। एक INSERT ट्रिगर में OLD छद्म तालिका नहीं है।

1

अगर मैं आपके सवाल का सही ..

जवाब नहीं है मिलता है! आपके पास अद्यतन ट्रिगर के बाद OLD.col_name नहीं हो सकता है।

mysql रेफरी के मैनुअल में आपके संदर्भ के लिए यह स्पष्ट रूप से तय है कि:

एक सम्मिलित ट्रिगर में, केवल NEW.col_name इस्तेमाल किया जा सकता; कोई पुरानी पंक्ति नहीं है। एक डेली ट्रिगर में, केवल OLD.col_name का उपयोग किया जा सकता है; कोई नई पंक्ति नहीं है। एक अद्यतन ट्रिगर में, आप अपडेट होने से पहले पंक्ति के कॉलम को संदर्भित करने के लिए OLD.col_name का उपयोग कर सकते हैं और NEW.col_name को अद्यतन होने के बाद पंक्ति के कॉलम का संदर्भ देने के लिए उपयोग कर सकते हैं।

Trigger Syntax

6

ट्रिगर शरीर में, पुराने और नए कीवर्ड पंक्तियों एक ट्रिगर से प्रभावित में स्तंभों का उपयोग करने के लिए सक्षम। पुराने और नए ट्रिगर करने के लिए MySQL एक्सटेंशन हैं; वे मामले संवेदनशील नहीं हैं।

एक आईएनएसईआरटी ट्रिगर में, केवल NEW.col_name का उपयोग किया जा सकता है; कोई पुरानी पंक्ति नहीं है। एक डेली ट्रिगर में, केवल OLD.col_name का उपयोग किया जा सकता है; कोई नई पंक्ति नहीं है। एक अद्यतन ट्रिगर में, आप अपडेट होने से पहले पंक्ति के कॉलम को संदर्भित करने के लिए OLD.col_name का उपयोग कर सकते हैं और NEW.col_name को अद्यतन होने के बाद पंक्ति के कॉलम का संदर्भ देने के लिए उपयोग कर सकते हैं।

संबंधित मुद्दे