बढ़िया मैनुअल से:
<ब्लॉकक्वॉट>
36.1. ट्रिगर व्यवहार का अवलोकन
[...]
पंक्ति-स्तरीय ट्रिगर के लिए, इनपुट डेटा में NEW
भी शामिल होता है INSERT
. के लिए पंक्ति और UPDATE
ट्रिगर, और/या OLD
UPDATE
के लिए पंक्ति और DELETE
ट्रिगर स्टेटमेंट-लेवल ट्रिगर्स के पास वर्तमान में स्टेटमेंट द्वारा संशोधित अलग-अलग पंक्तियों की जांच करने का कोई तरीका नहीं है।
और ट्रिगर प्रक्रियाओं से:
<ब्लॉकक्वॉट>
NEW
डेटा प्रकार RECORD
; INSERT
. के लिए नई डेटाबेस पंक्ति धारण करने वाला चर /UPDATE
पंक्ति-स्तर ट्रिगर में संचालन। यह वेरिएबल NULL
है स्टेटमेंट-लेवल ट्रिगर्स में और DELETE
. के लिए संचालन।
ध्यान दें कि यह पंक्ति-स्तरीय ट्रिगर और कथन-स्तरीय ट्रिगर के बारे में क्या कहता है।
आपके पास एक कथन-स्तरीय ट्रिगर है:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
स्टेटमेंट-लेवल ट्रिगर्स प्रति स्टेटमेंट एक बार ट्रिगर होते हैं और एक स्टेटमेंट कई पंक्तियों पर लागू हो सकता है, इसलिए प्रभावित पंक्ति की धारणा (जो है NEW
और OLD
के बारे में हैं) बस लागू नहीं होता।
यदि आप NEW
का उपयोग करना चाहते हैं (या OLD
) एक ट्रिगर में तो आप चाहते हैं कि ट्रिगर प्रत्येक प्रभावित पंक्ति के लिए निष्पादित हो और इसका मतलब है कि आप एक पंक्ति-स्तरीय ट्रिगर चाहते हैं:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
मैंने अभी-अभी FOR EACH STATEMENT
को बदला है करने के लिए FOR EACH ROW
।
आपका ट्रिगर भी कुछ लौटा रहा होगा:
<ब्लॉकक्वॉट>
एक ट्रिगर फ़ंक्शन को या तो NULL
लौटाना चाहिए या एक रिकॉर्ड/पंक्ति मान जिसमें ठीक उसी तालिका की संरचना हो जिसके लिए ट्रिगर को सक्रिय किया गया था।
[...]
एक पंक्ति-स्तरीय ट्रिगर का वापसी मान सक्रिय किया गया AFTER
या कथन-स्तरीय ट्रिगर BEFORE
सक्रिय किया गया है या AFTER
हमेशा अनदेखा किया जाता है; यह शून्य भी हो सकता है। हालांकि, इनमें से कोई भी ट्रिगर अभी भी त्रुटि उत्पन्न करके पूरे ऑपरेशन को रोक सकता है।
तो आपको RETURN NEW;
या RETURN NULL;
आपके ट्रिगर में। आपके पास एक ट्रिगर के बाद है, इसलिए इससे कोई फर्क नहीं पड़ता कि आप किस रिटर्न का उपयोग करते हैं, लेकिन मैं RETURN NEW;
के साथ जाऊंगा ।