ईएलएसई शाखा को मौलिक रूप से सरल बनाया जा सकता है। लेकिन कुछ और चीजें अक्षम/गलत/खतरनाक हैं:
CREATE OR REPLACE FUNCTION sample_trigger_func()
RETURNS TRIGGER AS
$func$
BEGIN
IF TG_OP = 'DELETE' THEN
RAISE INFO 'OLD: %', OLD.name;
EXECUTE format('INSERT INTO %I SELECT ($1).*', TG_TABLE_NAME || '_deletes')
USING OLD #= hstore('{mod_op, mod_datetime}'::text[]
, ARRAY[left(TG_OP, 1), now()::text]);
RETURN OLD;
ELSE -- insert, update
NEW.mod_op := left(TG_OP, 1);
NEW.mod_datetime := now();
RETURN NEW;
END IF;
END
$func$ LANGUAGE plpgsql;
-
ELSE. में शाखा बसनयाको असाइन करें सीधे। अधिक गतिशील एसक्यूएल की आवश्यकता नहीं है - जो एक ही ट्रिगर को फिर से एक अंतहीन लूप के कारण आग लगा देगा। यही प्राथमिक त्रुटि है। -
नया लौटाएं;IF. के बाहर कंस्ट्रक्शनDELETEके लिए आपके ट्रिगर फंक्शन को तोड़ देगा , चूंकिनयाDELETEs के लिए असाइन नहीं किया गया है। -
एक प्रमुख विशेषता
hstoreका उपयोग है और hstore ऑपरेटर#=प्रसिद्ध पंक्ति प्रकार . के दो चयनित फ़ील्ड को गतिशील रूप से बदलने के लिए - वह अज्ञात है कोड लिखते समय। इस तरह आप मूलOLD. के साथ छेड़छाड़ नहीं करते हैं मूल्य, जिसका आश्चर्यजनक दुष्प्रभाव हो सकता है यदि आपके पास घटनाओं की श्रृंखला को और अधिक ट्रिगर करता है।OLD #= hstore('{mod_op, mod_datetime}'::text[] , ARRAY[left(TG_OP, 1), now()::text]);अतिरिक्त मॉड्यूल
hstoreजरूर स्थापित होना चाहिए। विवरण:- डायनेमिक SQL का उपयोग करके कंपोजिट वैरिएबल फ़ील्ड का मान कैसे सेट करें
- PostgreSQL में एक रिकॉर्ड चर के लिए गतिशील रूप से कॉलम नाम पास करना
hstore(text[], text[])का उपयोग करना कोड>एकhstoreconstruct बनाने के लिए यहां वैरिएंट फ्लाई पर कई क्षेत्रों के साथ मूल्य। -
plpgsql में असाइनमेंट ऑपरेटर है
:=: -
ध्यान दें कि मैंने कॉलम नाम
mod_datetime. का उपयोग किया है भ्रामकmod_date. के बजाय , चूंकि कॉलम स्पष्ट रूप से एकटाइमस्टैम्पहै और कोईतारीखनहीं है ।
मैंने इसमें रहते हुए कुछ अन्य सुधार जोड़े। और ट्रिगर स्वयं इस तरह दिखना चाहिए:
CREATE TRIGGER insupdel_bef
BEFORE INSERT OR UPDATE OR DELETE ON table_name
FOR EACH ROW EXECUTE PROCEDURE sample_trigger_func();