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

ट्रिगर फ़ंक्शंस में वैरिएबल सेटिंग्स का उपयोग कैसे करें?

अनुकूलित विकल्प ठीक से:

  1. विकल्प अभी तक सेट नहीं है

    इसके सभी संदर्भ एक अपवाद raise पैदा करते हैं , जिसमें current_setting() जब तक दूसरे पैरामीटर missing_ok . के साथ कॉल नहीं किया जाता है . मैनुअल:

  2. विकल्प एक वैध पूर्णांक शाब्दिक पर सेट है

  3. विकल्प एक अमान्य पूर्णांक शाब्दिक पर सेट है

  4. विकल्प रीसेट (जो 3 के एक विशेष मामले में जल जाता है। )

    उदाहरण के लिए, यदि आप SET LOCAL . के साथ एक अनुकूलित विकल्प सेट करते हैं या set_config('myvars.user_id3', '55', true) , लेन-देन के अंत में विकल्प मान रीसेट हो जाता है। यह अभी भी मौजूद है , संदर्भित किया जा सकता है, लेकिन यह अब एक खाली स्ट्रिंग देता है ('' ) - जिसे integer . पर नहीं डाला जा सकता ।

आपके डेमो में स्पष्ट गलतियाँ एक तरफ, आपको सभी 4 मामलों की तैयारी करने की आवश्यकता है। तो:

CREATE OR REPLACE FUNCTION add_transition1()
  RETURNS trigger AS
$func$
DECLARE
   _user_id text := current_setting('myvars.user_id', true);  -- see 1.
BEGIN
   IF _user_id ~ '^\d+$' THEN  -- one or more digits?

      INSERT INTO transitions1 (user_id, house_id)
      VALUES (_user_id::int, NEW.id);  -- valid int, cast is safe

   ELSE

      INSERT INTO transitions1 (user_id, house_id)
      VALUES (NULL, NEW.id);           -- use NULL instead

      RAISE WARNING 'Invalid user_id % for house_id % was reset to NULL!'
                  , quote_literal(_user_id), NEW.id;  -- optional
   END IF;

   RETURN NULL;  -- OK for AFTER trigger
END
$func$  LANGUAGE plpgsql;

db<>fiddle यहां

नोट:

  • स्तंभ नामों से मेल खाने वाले चर नामों से बचें। बहुत त्रुटि प्रवण। एक लोकप्रिय नामकरण परंपरा है कि चर नामों को अंडरस्कोर के साथ जोड़ा जाए:_user_id

  • एक असाइनमेंट को सेव करने के लिए डिक्लेरेशन टाइम पर असाइन करें। डेटा प्रकार पर ध्यान दें text . अमान्य इनपुट को छांटने के बाद, हम बाद में कास्ट करेंगे।

  • यदि संभव हो तो अपवाद को ऊपर उठाने / फंसाने से बचें . मैनुअल:

  • वैध पूर्णांक तारों के लिए परीक्षण करें। यह सरल रेगुलर एक्सप्रेशन केवल अंकों की अनुमति देता है (कोई प्रमुख चिह्न नहीं, कोई सफेद स्थान नहीं):_user_id ~ '^\d+$' . मैं किसी भी अमान्य इनपुट के लिए NULL पर रीसेट करता हूं। अपनी ज़रूरतों के अनुसार अनुकूलित करें।

  • मैंने एक वैकल्पिक WARNING जोड़ा है आपकी डिबगिंग सुविधा के लिए।

  • मामले 3. और 4. केवल इसलिए उत्पन्न होता है क्योंकि अनुकूलित विकल्प स्ट्रिंग अक्षर हैं (टाइप करें text ), मान्य डेटा प्रकारों को स्वचालित रूप से लागू नहीं किया जा सकता है।

संबंधित:

इसके अलावा, आपकी सटीक आवश्यकताओं के आधार पर, अनुकूलित विकल्पों के बिना आप जो करने का प्रयास कर रहे हैं, उसके लिए और अधिक सुरुचिपूर्ण समाधान हो सकते हैं। शायद यह:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटा को सॉर्ट न करें कैसे रखें?

  2. PostgreSQL 9.4 - EXCLUDE बाधा में कस्टम ऑपरेटर का उपयोग करें

  3. PostgreSQL 12 में नया क्या है?

  4. बिना डुप्लीकेट के लेफ्ट जॉइन वाली चार टेबल्स में शामिल हों

  5. Postgres में सभी नई तालिकाओं पर किसी उपयोगकर्ता को अनुमति कैसे दें?