PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pemicu untuk menyisipkan baris dalam basis data jarak jauh setelah dihapus

Ini adalah aplikasi replikasi terbatas. Persyaratan sangat bervariasi, jadi ada sejumlah solusi mapan yang berbeda, menangani situasi yang berbeda. Pertimbangkan ikhtisar di manual.

Solusi berbasis pemicu Anda yang rajut tangan adalah salah satu opsi yang layak untuk relatif sedikit penghapusan. Membuka dan menutup koneksi terpisah untuk setiap baris menimbulkan biaya tambahan. Ada berbagai opsi lainnya.

Sementara bekerja dengan dblink saya menyarankan beberapa modifikasi. Yang terpenting:

  • Gunakan format() untuk keluar dari string dengan lebih elegan.

  • Lewati seluruh baris alih-alih melewati dan keluar dari setiap kolom.

  • Jangan letakkan sandi di setiap fungsi pemicu tunggal.
    Gunakan FOREIGN SERVER plus USER MAPPING . Petunjuk terperinci di sini:

Pada dasarnya, jalankan sekali di server sumber:

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');

Sebaiknya, jangan login sebagai superuser di server target. Gunakan peran khusus dengan hak istimewa terbatas untuk menghindari eskalasi hak istimewa.

Dan gunakan file sandi pada server target untuk memungkinkan akses tanpa kata sandi. Dengan cara ini Anda bahkan tidak perlu menyimpan kata sandi di USER MAPPING . Petunjuk di bab terakhir dari jawaban terkait ini:

Kemudian:

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;

Anda harus mengeja daftar kolom untuk tabel target jika jenis baris tidak cocok.

Jika Anda serius tentang ini:

Yaitu, Anda menyisipkan seluruh baris dan jenis baris target identik (tidak mengekstrak tanggal dari stempel waktu, dll.), Anda dapat menyederhanakan lebih jauh melewati seluruh baris.

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;

Terkait:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Saya ingin menampilkan dalam file postgis yang kurang dari 10.000 meter dan jarak yang dihitung

  2. PSQLException dan masalah kunci saat pemicu ditambahkan di atas meja

  3. Praktik terbaik untuk menyimpan string multibahasa

  4. Tampilan Daftar PostgreSQL

  5. Bagaimana saya harus mengimpor data dari CSV ke tabel Postgres menggunakan pgAdmin 3?