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

हटाने के बाद दूरस्थ डेटाबेस में पंक्तियों को सम्मिलित करने के लिए ट्रिगर

यह प्रतिकृति का एक सीमित अनुप्रयोग है। आवश्यकताएं बहुत भिन्न होती हैं, इसलिए विभिन्न स्थितियों को संबोधित करते हुए कई अलग-अलग स्थापित समाधान हैं। मैनुअल में ओवरव्यू पर विचार करें।

आपका हाथ से बुना हुआ, ट्रिगर-आधारित समाधान अपेक्षाकृत कुछ . के लिए एक व्यवहार्य विकल्प है हटाना प्रत्येक पंक्ति के लिए एक अलग कनेक्शन खोलना और बंद करना काफी अधिक खर्च करता है। अन्य विभिन्न विकल्प हैं।

जबकि dblink के साथ काम करते हुए मैं कुछ संशोधनों का सुझाव देता हूं। सबसे महत्वपूर्ण:

  • format() का प्रयोग करें स्ट्रिंग्स से अधिक सुंदर ढंग से बचने के लिए।

  • पूरी पंक्ति पास करें हर एक कॉलम को पास करने और भागने के बजाय।

  • पासवर्ड को हर एक ट्रिगर फ़ंक्शन में न रखें।
    एक FOREIGN SERVER का उपयोग करें प्लस USER MAPPING . विस्तृत निर्देश यहां:

असल में, एक बार run चलाएं स्रोत सर्वर पर:

CREATE SERVER myserver FOREIGN DATA WRAPPER dblink_fdw
OPTIONS (hostaddr '127.0.0.1', dbname 'gtr_bd_archive');

CREATE USER MAPPING FOR role_source SERVER myserver
OPTIONS (user 'postgres', password 'secret');

अधिमानतः, लक्ष्य सर्वर पर सुपरयुसर के रूप में लॉग इन न करें। विशेषाधिकार वृद्धि से बचने के लिए सीमित विशेषाधिकारों के साथ एक समर्पित भूमिका का उपयोग करें।

और पासवर्ड फ़ाइल का उपयोग करें पासवर्ड रहित पहुंच की अनुमति देने के लिए लक्ष्य सर्वर पर। इस तरह आपको पासवर्ड को USER MAPPING . में भी स्टोर नहीं करना पड़ेगा . इस संबंधित उत्तर के अंतिम अध्याय में निर्देश:

फिर:

CREATE OR REPLACE FUNCTION pg_temp.flux_tresorerie_historique_backup_row()
  RETURNS trigger AS
$func$
BEGIN
   PERFORM dblink_connect('myserver');  -- name of foreign server from above

   PERFORM dblink_exec( format(
   $$
   INSERT INTO flux_tresorerie_historique  -- provide target column list!
   SELECT (r).id_flux_historique
        , (r).date_operation_flux
        , (r).date_valeur_flux
        , (r).date_rapprochement_flux::date  -- 'YYYY-MM-DD' is default ISO format anyway
        , (r).libelle_flux
        , (r).montant_flux
        , (r).contre_valeur_dzd
        , (r).rib_compte_bancaire
        , (r).frais_flux
        , (r).sens_flux
        , (r).statut_flux
        , (r).code_devise
        , (r).code_mode_paiement
        , (r).code_agence
        , (r).code_compte
        , (r).code_banque
        , (r).date_maj_flux
        , (r).statut_frais
        , (r).reference_flux
        , (r).code_commission
        , (r).id_flux
   FROM   (SELECT %L::flux_tresorerie_historique) t(r)
   $$, OLD::text));  -- cast whole row type

   PERFORM dblink_disconnect();
   RETURN NULL;  -- only for AFTER trigger
END
$func$  LANGUAGE plpgsql;

यदि पंक्ति प्रकार मेल नहीं खाते हैं, तो आपको लक्ष्य तालिका के लिए स्तंभों की सूची बनानी चाहिए।

अगर आप इस बारे में गंभीर हैं:

यानी, आप पूरी पंक्ति डालें और लक्ष्य पंक्ति प्रकार समान है (किसी टाइमस्टैम्प आदि से कोई तिथि नहीं निकालना), आप पूरी पंक्ति को आगे बढ़ाते हुए बहुत आसान बना सकते हैं।

CREATE OR REPLACE FUNCTION flux_tresorerie_historique_backup_row()
  RETURNS trigger AS
$func$
BEGIN
   PERFORM dblink_connect('myserver');  -- name of foreign server

   PERFORM dblink_exec( format(
   $$
   INSERT INTO flux_tresorerie_historique
   SELECT (%L::flux_tresorerie_historique).*
   $$
   , OLD::text));

   PERFORM dblink_disconnect();
   RETURN NULL;  -- only for AFTER trigger
END
$func$  LANGUAGE plpgsql;

संबंधित:



  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. क्या PostgreSQL क्वेरी में नामित स्थिरांक को परिभाषित करने का कोई तरीका है?

  4. JDBC प्रकार के लिए कोई बोली मानचित्रण नहीं:2003

  5. SQLite3 और रेल क्वेरी मुद्दों पर पोस्टग्रेज/हेरोकू रूबी