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

ट्रिगर फ़ंक्शन में पंक्ति प्रकार के डायनामिक कॉलम नाम तक पहुंचें

इसे यह करना चाहिए:

CREATE OR REPLACE FUNCTION device_bid_modifiers_count_per()
  RETURNS TRIGGER AS
$func$
DECLARE
   devices_count int      := device_types_count();
   table_name    regclass := TG_ARGV[0];
   column_name   text     := TG_ARGV[1];
BEGIN
   LOCK TABLE device_types IN EXCLUSIVE MODE;
   EXECUTE format('LOCK TABLE %s IN EXCLUSIVE MODE', table_name);

   IF TG_OP = 'DELETE' THEN
      PERFORM validate_bid_modifiers_count(table_name
                                         , column_name
                                         , (row_to_json(OLD) ->> column_name)::bigint
                                         , devices_count);
   ELSE
      PERFORM validate_bid_modifiers_count(table_name
                                         , column_name
                                         , (row_to_json(NEW) ->> column_name)::bigint
                                         , devices_count);
   END IF;

   RETURN NEW;
END
$func$  LANGUAGE plpgsql;

त्रुटि संदेश का तात्कालिक कारण बाहरी SELECT था . लक्ष्य के बिना, आपको इसे PERFORM . से बदलना होगा plpgsql में। लेकिन आंतरिक PERFORM EXECUTE . को पास की गई क्वेरी स्ट्रिंग में गलत भी था। PERFORM एक plpgsql कमांड है, जो EXECUTE . को पास की गई SQL स्ट्रिंग में मान्य नहीं है , जो SQL कोड की अपेक्षा करता है। आपको SELECT . का उपयोग करना होगा वहां। अंत में OLD और NEW EXECUTE . के अंदर दिखाई नहीं दे रहे हैं और क्या प्रत्येक अपना एक अपवाद उठाएगा जिस तरह से आपके पास था। EXECUTE . को छोड़कर सभी समस्याओं का समाधान किया जाता है ।

डायनामिक कॉलम नाम . का मान प्राप्त करने का एक सरल और तेज़ तरीका पंक्ति प्रकारों से OLD और NEW :json . पर कास्ट करें , तो आप प्रदर्शित किए गए कुंजी नाम को पैरामीटर कर सकते हैं। डायनेमिक SQL वाले विकल्प की तुलना में थोड़ा सरल और तेज़ होना चाहिए - जो संभव भी है, जैसे:

  ...
  EXECUTE format('SELECT validate_bid_modifiers_count(table_name
                                                    , column_name
                                                    , ($1.%I)::bigint
                                                    , devices_count)', column_name)
  USING OLD;
  ...

संबंधित:

एक तरफ:सुनिश्चित नहीं है कि आपको भारी तालों की आवश्यकता क्यों है।

इसके अलावा 2:इसके बजाय प्रत्येक ट्रिगर के लिए एक अलग ट्रिगर फ़ंक्शन लिखने पर विचार करें। अधिक शोर वाला DDL, लेकिन निष्पादित करने के लिए सरल और तेज़।



  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 में स्पष्ट लेनदेन अलगाव उल्लंघन

  2. PostgreSQL अनुक्रमित कॉलम पर अनुक्रमिक स्कैन क्यों करता है?

  3. स्क्रिप्ट के काम करने पर अब पोस्टग्रेज () टाइमस्टैम्प नहीं बदलता है

  4. पोस्टग्रेस्क्ल क्वेरी पर बड़ा परिणामसेट

  5. PostgreSQL चयन क्वेरी में कॉलम की अधिकतम संख्या क्या है