आप format()
. का उपयोग कर सकते हैं एक गतिशील SQL क्वेरी बनाना बहुत आसान बनाने के लिए क्योंकि यह स्वचालित रूप से पहचानकर्ताओं और शाब्दिकों के साथ सही ढंग से निपटेगा। एक बात जिसे लोग आमतौर पर नज़रअंदाज़ कर देते हैं, वह यह है कि आप (...).*
का उपयोग करके एकल रिकॉर्ड व्यंजक को उसके सभी स्तंभों तक विस्तृत कर सकते हैं - यह NEW
. के लिए भी काम करता है और OLD
एक ट्रिगर में रिकॉर्ड चर, उदा। select (new).*
आप using
execute
. का कीवर्ड बयान। रिकॉर्ड और टेक्स्ट प्रस्तुति के बीच रिकॉर्ड को आगे और पीछे बदलने की कोई आवश्यकता नहीं है।
उस संभावना का उपयोग करके आपके ट्रिगर फ़ंक्शन को सरल बनाया जा सकता है:
DECLARE
l_sql text;
BEGIN
IF TG_TABLE_SCHEMA = 'public' THEN
newtable := TG_TABLE_NAME || '_actividad';
ELSE
newtable := TG_TABLE_SCHEMA || '_' || TG_TABLE_NAME || '_actividad';
END IF;
PERFORM creartablaactividad(TG_TABLE_SCHEMA, TG_TABLE_NAME);
l_sql := 'INSERT INTO actividad.%I SELECT current_user, current_timestamp, %L, ($1).*';
IF TG_OP = 'DELETE' THEN
execute format(l_sql, newtable, 'D') using OLD;
RETURN OLD;
ELSE
-- covers UPDATE and INSERT
execute format(l_sql, newtable, 'U') using NEW;
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
%I
. जैसे प्लेसहोल्डर्स का उपयोग करना और %L
वास्तविक SQL को केवल एक बार परिभाषित करना और उसका पुन:उपयोग करना संभव बनाता है। उन "पैरामीटर" को format()
. से बदल दिया जाता है फ़ंक्शन (जो $1
. को सुरक्षित रखता है )
($1).*
. के उपयोग पर ध्यान दें एसक्यूएल स्ट्रिंग के अंदर। इससे execute
हो जाएगा स्टेटमेंट रिकॉर्ड पैरामीटर का विस्तार करता है $1
इसके सभी स्तंभों के लिए। रिकॉर्ड को "मूल रूप से" USING
. के साथ पास किया जाता है कीवर्ड।
INSERT
. का उपयोग लक्ष्य स्तंभ सूची के बिना (insert into some_table ...
insert into some_table (col1, col2, ...) ...
) करने के लिए एक बहुत ही नाजुक चीज है। यदि स्रोत और लक्ष्य मेल नहीं खाते हैं तो इंसर्ट आसानी से विफल हो सकता है। .
यदि आप ऑडिट टेबल पर बड़े पैमाने पर रिपोर्टिंग नहीं चलाते हैं (जहां स्पष्ट कॉलम नाम अधिक कुशल होंगे) तो आप JSON
का उपयोग करके अधिक सामान्य ऑडिट ट्रिगर के बारे में सोचना चाहेंगे। या HSTORE
पूरे रिकॉर्ड को स्टोर करने के लिए कॉलम। कई तैयार ऑडिट ट्रिगर उपलब्ध हैं:
- http://okbob.blogspot. de/2015/01/most-simply-implementation-of-history.html
- https://github.com/wingspan/wingspan-auditing
- https://www.cybertec-postgresql.com /hi/tracking-changes-in-postgresql/
- https://wiki.postgresql.org/wiki/Audit_trigger_91plus