2010-06-03 13 views
20

मैं एक टेबल पर एक ट्रिगर का उपयोग करना चाहता हूं जिसे हर बार एक पंक्ति डालने, अपडेट करने या हटाए जाने पर निकाल दिया जाएगा।ओरेकल और ट्राइगर्स (डाला गया, अपडेट किया गया, हटाया गया)

मैं कुछ इस तरह लिखा है:

CREATE or REPLACE TRIGGER test001 
    AFTER INSERT OR DELETE OR UPDATE ON tabletest001 
    REFERENCING OLD AS old_buffer NEW AS new_buffer 
    FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00') 

और यह काम करता है। चूंकि पंक्ति को डालने, अपडेट करने या हटाए जाने पर मैं वही काम करना चाहता हूं, इसलिए मैं जानना चाहता हूं कि ट्रिगर में क्या हो रहा है। मुझे लगता है कि मैं यह पता लगाने के लिए प्रबंधन कर सकता हूं कि पंक्ति डाली गई है या अपडेट की गई है (मैं old_buffer को new_buffer के साथ देख सकता हूं)। मुझे कैसे पता चलेगा कि पंक्ति हटा दी गई है या नहीं?

उत्तर

36
Using Triggers से

:

DML ऑपरेशन यही एक उत्प्रेरक निकाल दिया

DML ऑपरेशन की एक से अधिक प्रकार पर सम्मिलित करें (उदाहरण के लिए ट्रिगर सक्रिय कर सकता है, या हटाना तो या अद्यतन का पता लगा रहा Emp_tab), ट्रिगर बॉडी सशर्त भविष्यवाणी INSERTING, डिलीटिंग का उपयोग कर सकती है, और यह जांचने के लिए कि कथन प्रकार किस प्रकार ट्रिगर को आग लगाता है।

तो

IF DELETING THEN ... END IF; 

अपने मामले के लिए काम करना चाहिए।

+2

आपके उत्तर के लिए धन्यवाद। यह काम करता हैं। मुझे हटाने के साथ कुछ समस्याएं हैं I मुझे लगता है कि यह इस स्थिति का नया कारण नहीं है new_buffer.field1 = 'HBP00'। – LeftyX

1

इसे 2 ट्रिगर्स में अलग करें। हटाने के लिए एक और प्रविष्टि \ अद्यतन के लिए एक।

+0

धन्यवाद, लेकिन मैं कैसे आपरेशन की पहचान के लिए जानना चाहता था। अल्बर्टो – LeftyX

+1

@ लेफ्टिक्सएक्स यही कारण है कि आपको टोनी एंड्रयूज नहीं, डेवियो के जवाब को स्वीकार करना चाहिए। – pauloya

4

नए मान (या NEW_BUFFER जैसा कि आपने उनका नाम बदल दिया है) केवल तभी उपलब्ध हैं जब इनर्सिंग और अपडेटिंग हो। हटाने के लिए आपको OLD (OLD_BUFFER) का उपयोग करने की आवश्यकता होगी। तो अपने ट्रिगर बन जाएगा:

CREATE or REPLACE TRIGGER test001 
    AFTER INSERT OR DELETE OR UPDATE ON tabletest001 
    REFERENCING OLD AS old_buffer NEW AS new_buffer 
    FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 

आप कोड है कि फ़ील्ड 1 'HBP000' से कुछ और करने के लिए अद्यतन के लिए पूरा करने के लिए ट्रिगर के अंदर तर्क जोड़ने की जरूरत हो सकती है।

+0

मैंने इसे 10 मिनट पहले समझा है ;-) धन्यवाद। अल्बर्टो – LeftyX

18

मैं इस तरह मेरे कोड बदल दिया है और यह काम करता है:

CREATE or REPLACE TRIGGER test001 
    AFTER INSERT OR UPDATE OR DELETE ON tabletest001 
    REFERENCING OLD AS old_buffer NEW AS new_buffer 
    FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00') 

DECLARE 
     Operation  NUMBER; 
     CustomerCode CHAR(10 BYTE); 
BEGIN 

IF DELETING THEN 
    Operation := 3; 
    CustomerCode := :old_buffer.field1; 
END IF; 

IF INSERTING THEN 
    Operation := 1; 
    CustomerCode := :new_buffer.field1; 
END IF; 

IF UPDATING THEN 
    Operation := 2; 
    CustomerCode := :new_buffer.field1; 
END IF;  

// DO SOMETHING ... 

EXCEPTION 
    WHEN OTHERS THEN ErrorCode := SQLCODE; 

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