PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wyzwalacz wstawiania wierszy do zdalnej bazy danych po usunięciu

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żyj FOREIGN SERVER plus USER 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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uniknąć wielokrotnego wstawiania w PostgreSQL

  2. Zmień normalną tabelę na obcą tabelę cstore_fdw

  3. Znajdź źródło zapytania przez pgbouncer

  4. PostgreSQL:unikalne ograniczenie lub unikalny indeks

  5. Musisz utworzyć wyzwalacz, który zwiększa wartość w tabeli po wstawieniu