Toto je omezená aplikace replikace. Požadavky se velmi liší, takže existuje řada různých zavedených řešení, která řeší různé situace. Podívejte se na přehled v příručce.
Vaše ručně pletené řešení založené na spoušti je jednou schůdnou možností pro relativně několik výmazy. Otevírání a zavírání samostatného připojení pro každý řádek vyžaduje poměrně velkou režii. Existují další různé možnosti.
Zatímco práce s dblink Navrhuji některé úpravy. To nejdůležitější:
-
Použijte
format()
elegantněji uniknout řetězcům. -
Předejte celou řadu místo procházení a útěku z každého jednotlivého sloupce.
-
Neumisťujte heslo do každé jednotlivé spouštěcí funkce.
PoužijteFOREIGN SERVER
plusUSER MAPPING
. Podrobné pokyny zde:
V zásadě spusťte jednou na zdrojovém serveru:
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');
Pokud možno, nepřihlašujte se jako superuživatel na cílovém serveru. Použijte vyhrazenou roli s omezenými oprávněními, abyste se vyhnuli eskalaci oprávnění.
A použijte soubor s heslem
na cílovém serveru, aby byl umožněn přístup bez hesla. Tímto způsobem ani nemusíte ukládat heslo do USER MAPPING
. Pokyny v poslední kapitole této související odpovědi:
Potom:
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;
Pokud se typy řádků neshodují, měli byste uvést seznam sloupců pro cílovou tabulku.
Pokud to myslíte vážně:
To znamená, že vložíte celý řádek a typ cílového řádku je identický (žádné extrahování data z časového razítka atd.), můžete dále zjednodušit předávání celého řádku.
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;
Související: