यह प्रतिकृति का एक सीमित अनुप्रयोग है। आवश्यकताएं बहुत भिन्न होती हैं, इसलिए विभिन्न स्थितियों को संबोधित करते हुए कई अलग-अलग स्थापित समाधान हैं। मैनुअल में ओवरव्यू पर विचार करें।
आपका हाथ से बुना हुआ, ट्रिगर-आधारित समाधान अपेक्षाकृत कुछ . के लिए एक व्यवहार्य विकल्प है हटाना प्रत्येक पंक्ति के लिए एक अलग कनेक्शन खोलना और बंद करना काफी अधिक खर्च करता है। अन्य विभिन्न विकल्प हैं।
जबकि 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;
संबंधित: