sql >> Databáze >  >> RDS >> PostgreSQL

Po smazání spusťte vložení řádků do vzdálené databáze

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žijte FOREIGN SERVER plus USER 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í:



  1. Nejrychlejší způsob, jak zkontrolovat již existující záznam před vložením [mysql_errno()]

  2. Snažím se spustit mysql-client v Dockeru, ale byl mi odepřen přístup kvůli chybě uživatele

  3. Vytvořit aliasy hromadně?

  4. Jak vytvořit cizí klíč pro 2 tabulky?