यह (या कम से कम) ज्ञात था कि आप ट्रिगर के अंदर एक म्यूटिंग टेबल पर डीएमएल स्टेटमेंट का उपयोग नहीं कर सकते हैं। Oracle दस्तावेज़ीकरण का एक अंश :
एक उत्परिवर्तन तालिका एक तालिका है जिसे एक अद्यतन, DELETE, या INSERT विवरण, या एक तालिका द्वारा संशोधित किया जा रहा है जिसे एक DELETE CASCADE बाधा के प्रभाव से अद्यतन किया जा सकता है।
सत्र जिसने ट्रिगरिंग स्टेटमेंट जारी किया है वह एक उत्परिवर्तन तालिका को क्वेरी या संशोधित नहीं कर सकता है। यह प्रतिबंध डेटा के असंगत सेट को देखने से ट्रिगर को रोकता है।
हालाँकि, मैं यह समझ नहीं पा रहा हूँ कि जब मैं insert into emp
SQL डेवलपर या इंटरनेट कनेक्शन का उपयोग कर रहा हूँ तो यह डेमो ट्रिगर "म्यूटिंग टेबल" त्रुटि के साथ विफल क्यों नहीं हो रहा है :
CREATE OR REPLACE TRIGGER emp_bri
BEFORE INSERT ON emp
FOR EACH ROW
BEGIN
SELECT max(id) + 1 INTO :NEW.id FROM emp;
UPDATE emp SET salary = 5000;
END emp_bri;
प्रविष्टि अगले id
मान के साथ सफलतापूर्वक पूर्ण होती है और सभी emp
रिकॉर्ड को अपडेट करती है। मैं Oracle डेटाबेस 11g एंटरप्राइज़ संस्करण रिलीज़ 11.2.0.1.0 का उपयोग कर रहा हूं। मैंने कंपाउंड ट्रिगर्स के बारे में पढ़ा है लेकिन नमूना उनका उपयोग नहीं करता है।
select max(id)
। बस नहीं है। यह बस गलत है और यह पैमाने पर भी नहीं होगा।