PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

ट्रिगर फ़ंक्शन में अंतहीन लूप

ईएलएसई शाखा को मौलिक रूप से सरल बनाया जा सकता है। लेकिन कुछ और चीजें अक्षम/गलत/खतरनाक हैं:

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 जरूर स्थापित होना चाहिए। विवरण:

    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();

SQL Fiddle.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. विदेशी तालिका में सूचकांक का उपयोग कैसे करें PostgreSQL में MAX (आईडी) क्वेरी का चयन करें?

  2. RDSdataService execute_statement रिटर्न (BadRequestException)

  3. उत्पादन में Play Framework 2 डेटाबेस विकास को कैसे संभालें

  4. repmgr 2.0 की घोषणा

  5. PostgreSQL json_agg () फ़ंक्शन एक खाली सरणी क्यों नहीं लौटाता है?