आपका ट्रिगर फ़ंक्शन इस प्रकार ठीक से काम करेगा:
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 (plpgsql) में डबल कोट्स को सिंगल कोट्स से बदलें
एक तरफ: जब आप Postgres में नए होते हैं तो आप इस प्रकार के उन्नत गतिशील SQL का सावधानीपूर्वक उपयोग करना चाह सकते हैं। आपको यह समझने की जरूरत है कि आप क्या कर रहे हैं।