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

एक ट्रिगर फ़ंक्शन में निष्पादित करने के लिए पुराने, नए और पहचानकर्ताओं को कैसे पास करें?

आपका ट्रिगर फ़ंक्शन इस प्रकार ठीक से काम करेगा:

CREATE OR REPLACE FUNCTION loca_app.func_historico_mod_usuarios()
  RETURNS trigger AS
$func$
BEGIN
   EXECUTE format(
      'INSERT INTO loca_app.tb_modificacoes
              (mod_momento, mod_valor_anterior, mod_valor_atual, mod_usuario, mod_dado)
       VALUES (now()      , $1.%1$I           , $2.%1$I        , $3         , $4)

              )', TG_ARGV[0])
   USING OLD, NEW, TG_RELID
      , (SELECT dad_id FROM loca_app.tb_dados
         WHERE  dad_nome = TG_ARGV[0]  -- cast? see blow
         LIMIT  1);

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

प्रमुख बिंदु

  • विशेष पंक्ति मान पास करें पुराना और नया साथ ही TG_RELID मानों . के रूप में करने के लिए निष्पादित करें उपयोग . के साथ खंड। आपको TG_RELID डालना पड़ सकता है एक उपयुक्त डेटा प्रकार के लिए। tb_modificacoes . की तालिका परिभाषा अज्ञात है। या आप वास्तव में यहाँ कुछ और चाहते हैं। नीचे देखें।
    $1 , $2 और $3 SQL स्ट्रिंग में EXECUTE . को पास किया गया उपयोग . में भावों का संदर्भ लें खंड, नहीं फ़ंक्शन पैरामीटर के लिए, जिसे फ़ंक्शन बॉडी बाहर . में समान स्थितीय सिंटैक्स के साथ संदर्भित किया जा सकता है निष्पादित करें

  • फॉर्मेट () . ज्यादा साफ और सुरक्षित। पहचानकर्ता को उद्धृत करें और बचें , कोड और मान अच्छी तरह से! %1$I और %1$L format() . के लिए प्रारूप विनिर्देशक हैं . विवरण के लिए मैनुअल पढ़ें।

  • सही मामले की आवश्यकता है! ऊपरी केस अक्षरों वाले पहचानकर्ताओं को वर्तनी के लिए आपका सम्मेलन ओरेकल में समझ में आता है, जहां गैर-उद्धृत पहचानकर्ता ऊपरी-केस अक्षरों में परिवर्तित हो जाते हैं। यह पोस्टग्रेज में उपयोगी नहीं है, जहां सब कुछ इसके बजाय लोअर केस में फोल्ड किया जाता है:

  • ILIKE . का प्रयोग न करें DAD_NOME ILIKE 'USU_NASCIMENTO' . में . पोस्टग्रेज पहचानकर्ता केस संवेदनशील होते हैं। आप कर सकते थे dad_nome . में कई मिलान वाले मान हैं . = का प्रयोग करें इसके बजाय और सही ढंग से लिखे गए पहचानकर्ताओं को पास करें। और सुनिश्चित करें कि dad_nome अद्वितीय परिभाषित किया गया है। नीचे देखें।

  • आपकी टिप्पणी कहती है:MOD_USUARIO , -- अनुवादित:उपयोगकर्ता (आईडी) . लेकिन यह वह नहीं है जिसे आप पास करते हैं। मैनुअल:

    आप current_user . का उपयोग करना चाह सकते हैं या session_user इसके बजाय:

  • आप LIMIT 1 remove को हटा सकते हैं सबक्वेरी से अगर dad_nome परिभाषित किया गया है UNIQUE . अन्यथा आपको यह तय करना होगा कि टाई होने की स्थिति में कौन सी पंक्ति चुननी है - ORDER BY . के साथ ।

  • ट्रिगर फ़ंक्शन आवश्यक हैं एक रिटर्न . के साथ समाप्त करने के लिए बयान। रिटर्न न्यूल भी हो सकता है बाद . के लिए चालू कर देना। मैनुअल:

संबंधित:

एक तरफ: जब आप Postgres में नए होते हैं तो आप इस प्रकार के उन्नत गतिशील SQL का सावधानीपूर्वक उपयोग करना चाह सकते हैं। आपको यह समझने की जरूरत है कि आप क्या कर रहे हैं।



  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:बड़े टेबल के छोटे सबसेट में शामिल होने का सबसे अच्छा तरीका

  3. लंबे प्रकार के लिए खराब मूल्य:- पोस्टग्रेस्क्ल, हाइबरनेट, स्प्रिंग

  4. SQL - एकाधिक समान प्रश्नों का मेल

  5. Postgresql बिट भिन्न को पूर्णांक में बदलें