ईएलएसई
शाखा को मौलिक रूप से सरल बनाया जा सकता है। लेकिन कुछ और चीजें अक्षम/गलत/खतरनाक हैं:
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[])का उपयोग करना कोड>
एकhstore
construct बनाने के लिए यहां वैरिएंट फ्लाई पर कई क्षेत्रों के साथ मूल्य। -
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();