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

एक ट्रिगर से गुजरने वाले चरित्र में अल्पविराम के साथ डेटा को कैसे सहेजना है?

आप 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 पूरे रिकॉर्ड को स्टोर करने के लिए कॉलम। कई तैयार ऑडिट ट्रिगर उपलब्ध हैं:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL 9.3:संघ दो कॉलम एक में

  2. उसकेोकू पर पोस्टग्रेएसक्यूएल डीबी में 255 से अधिक वर्णों को संग्रहीत करना

  3. Postgresql में सरणी को पंक्तियों में कैसे विभाजित करें?

  4. Postgresql किसी फ़ंक्शन में निष्पादन प्रारूप का उपयोग करने का प्रयास कर रहा है लेकिन कॉलम प्राप्त करने में त्रुटि नहीं मिली है जब कोलेस में स्ट्रिंग प्रारूप दे रहा है

  5. VS2015 में PostgreSQL प्लगइन के साथ स्थिर रूप से Qt 5.8 को कैसे संकलित करें