PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Kích hoạt để chèn các hàng trong cơ sở dữ liệu từ xa sau khi xóa

Đây là một ứng dụng nhân rộng hạn chế. Các yêu cầu khác nhau rất nhiều, vì vậy có một số giải pháp được thiết lập khác nhau, giải quyết các tình huống khác nhau. Xem xét tổng quan trong sách hướng dẫn.

Giải pháp đan tay, dựa trên trình kích hoạt của bạn là một lựa chọn khả thi cho tương đối ít xóa. Việc mở và đóng một kết nối riêng biệt cho mỗi hàng sẽ phát sinh chi phí khá lớn. Có nhiều tùy chọn khác nhau.

Trong khi làm việc với dblink Tôi đề nghị một số sửa đổi. Quan trọng nhất:

  • Sử dụng format() để thoát các chuỗi một cách thanh lịch hơn.

  • Vượt qua toàn bộ hàng thay vì chuyển và thoát từng cột.

  • Không đặt mật khẩu trong mọi chức năng kích hoạt đơn lẻ.
    Sử dụng FOREIGN SERVER cộng với USER MAPPING . Hướng dẫn chi tiết tại đây:

Về cơ bản, chạy một lần trên máy chủ nguồn:

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

Tốt hơn là không đăng nhập với tư cách superuser tại máy chủ mục tiêu. Sử dụng một vai trò chuyên dụng với các đặc quyền hạn chế để tránh leo thang đặc quyền.

Và sử dụng tệp mật khẩu trên máy chủ đích để cho phép truy cập không cần mật khẩu. Bằng cách này, bạn thậm chí không phải lưu trữ mật khẩu trong USER MAPPING . Hướng dẫn trong chương cuối của câu trả lời liên quan này:

Sau đó:

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;

Bạn nên đánh vần danh sách các cột cho bảng mục tiêu nếu các loại hàng không khớp.

Nếu bạn nghiêm túc về điều này:

Tức là bạn chèn toàn bộ hàng và loại hàng mục tiêu giống hệt nhau (không trích xuất ngày từ dấu thời gian, v.v.), bạn có thể đơn giản hóa hơn nữa việc chuyển toàn bộ hàng.

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;

Có liên quan:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển danh sách các tham số cho SQL trong psycopg2

  2. Thuật toán so khớp trong SQL

  3. Lỗi:Không thể tạo TypedQuery cho truy vấn có nhiều trả lại

  4. Khắc phục “LỖI:mỗi truy vấn INTERSECT phải có cùng số cột” trong PostgreSQL

  5. PostgreSQL - giá trị động dưới dạng tên bảng