मेरे पास एक टेबल है charass इस टेबल पर मेरे पास एक ट्रिगर है

CREATE TRIGGER charassheattrigger
    BEFORE INSERT OR UPDATE 
    ON public.charass
    FOR EACH ROW
    EXECUTE PROCEDURE public._charassheattrigger();

इस ट्रिगर द्वारा निष्पादित कार्य इस तरह दिखता है

CREATE OR REPLACE FUNCTION public._charassheattrigger()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE
AS $BODY$

BEGIN

  IF (TG_OP = 'INSERT' OR (TG_OP = 'UPDATE' AND OLD.charass_value <> NEW.charass_value)) AND NEW.charass_char_id = 34 THEN
    IF NOT EXISTS(SELECT true FROM heat WHERE heat_number = NEW.charass_value) THEN
      INSERT INTO heat (heat_number,heat_created,heat_vend_id) 
        SELECT NEW.charass_value,NOW(), order_vend_id
        FROM ls
        JOIN detail ON (ls_id = detail_ls_id)
        JOIN hist ON (detail_hist_id = hist_id)
        JOIN order ON (hist_order_id = order_id)
        WHERE hist_ordtype = 'PO' AND hist_transtype = 'RP' AND ls_id = NEW.charass_target_id;
    END IF;
  END IF;  

  RETURN NEW;
END;
$BODY$;

जब मैं लॉग फ़ाइल को देखता हूं। मैं निष्पादित कथन देख सकता हूँ

statement: INSERT INTO charass (charass_value, charass_target_type, charass_target_id, charass_char_id) VALUES ('123456789', 'LS', 1234, 34)

मैं हीट टेबल को '123456789' के रूप में हीट_नंबर के साथ एक रिकॉर्ड देखने की उम्मीद कर रहा हूं, लेकिन हीट टेबल में कुछ भी नहीं है।

तो मैं फिर पीजी व्यवस्थापक खोलता हूं और उपरोक्त कथन की प्रतिलिपि बनाता हूं और इसे मैन्युअल रूप से निष्पादित करता हूं। अब हीट टेबल में रिकॉर्ड है।

मैनुअल इंसर्ट और एप्लिकेशन द्वारा किए गए इंसर्ट में क्या अंतर है। बताने का कोई तरीका है? कथन के पीछे उपयोगकर्ता नाम समान है इसलिए यह अनुमति की बात नहीं हो सकती है। मैं सोच रहा था कि क्या ट्रिगर फ़ंक्शन से लॉग फ़ाइल में जानकारी भेजने का कोई तरीका है, इसलिए मैं इसकी समीक्षा कर सकता हूं

2
caleb baker 17 मार्च 2020, 17:35

1 उत्तर

सबसे बढ़िया उत्तर

postgresql.conf में auto_explain को shared_preload_libraries में जोड़ें और साथ ही ये अतिरिक्त पैरामीटर:

auto_explain.log_nested_statements = on
auto_explain.log_min_duration = 0

फिर PostgreSQL को पुनरारंभ करें।

अब आपको उनके निष्पादन योजना के साथ लॉग किए गए फ़ंक्शन के अंदर स्टेटमेंट मिलेंगे।

0
Laurenz Albe 17 मार्च 2020, 16:32