To jest ograniczone zastosowanie replikacji. Wymagania są bardzo zróżnicowane, dlatego istnieje wiele różnych ustalonych rozwiązań, odnoszących się do różnych sytuacji. Rozważ omówienie w podręczniku.
Twoje ręcznie robione, oparte na spustach rozwiązanie jest jedną z realnych opcji dla stosunkowo niewielu usunięcia. Otwieranie i zamykanie osobnego połączenia dla każdego rzędu wiąże się z dużym obciążeniem. Istnieją inne różne opcje.
Podczas pracując z dblink sugeruję pewne modyfikacje. Co najważniejsze:
-
Użyj
format()
aby bardziej elegancko uciekać od ciągów. -
Przekaż cały wiersz zamiast przechodzić i uciekać z każdej kolumny.
-
Nie umieszczaj hasła w każdej funkcji wyzwalacza.
UżyjFOREIGN SERVER
plusUSER MAPPING
. Szczegółowe instrukcje tutaj:
Zasadniczo uruchom raz na serwerze źródłowym:
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');
Najlepiej nie logować się jako superużytkownik na serwerze docelowym. Użyj dedykowanej roli z ograniczonymi uprawnieniami, aby uniknąć eskalacji uprawnień.
I użyj pliku z hasłami
na serwerze docelowym, aby umożliwić dostęp bez hasła. W ten sposób nie musisz nawet przechowywać hasła w USER MAPPING
. Instrukcje w ostatnim rozdziale tej powiązanej odpowiedzi:
Następnie:
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;
Powinieneś przeliterować listę kolumn tabeli docelowej, jeśli typy wierszy się nie zgadzają.
Jeśli myślisz o tym poważnie:
Oznacza to, że wstawiasz cały wiersz a typ wiersza docelowego jest identyczny (bez pobierania daty ze znacznika czasu itp.), możesz znacznie uprościć przekazywanie całego wiersza.
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;
Powiązane: