Postgresql

PostgreSQL 中是否有某種表級複製?

  • January 25, 2016

我在 PostgreSQL 9.1 中使用兩個數據庫,比如AB,每個應用程序一個。數據庫B需要讀取(而不是寫入)數據庫A中的一個表(比如users),但同時數據庫B中的一些表需要引用它們的一些欄位作為表users上的外鍵。

到目前為止,我已經嘗試過:

  • 查找某種本機表級複製,因此使用者的任何更改都會自動複製到數據庫B中的複製表中。什麼也沒找到。
  • 創建一個TRIGGER使用者,以便在任何更改後呼叫一個函式,但這並不能解決任何問題,因為我無法將數據庫A中的值插入到數據庫B的表中。
  • 使用FOREIGN TABLEs。兩者都沒有解決它,因為沒有外鍵可以應用於外表。
  • 使用 aSCHEMA而不是A,但應用程序將其強制為數據庫DATABASE
  • 我什至考慮過每分鐘都有一個 CRON 將表從A轉儲並導入到B,但這會破壞與其他表的任何外鍵關係。

我不能將兩個數據庫合二為一(儘管從技術上講,它們都有唯一命名的表),因為當升級其中一個時,它會檢查數據庫,如果其中有任何奇怪的東西,它就會失敗。

我在這裡還有其他機會嗎?任何提示都非常感謝。

我終於設法找到了迄今為止有效的解決方案。我plpython隨模組一起安裝了過程語言模組psycopg2,編寫了一個FUNCTION並創建了兩個TRIGGERs,一個用於INSERT,一個用於DELETE(我不會有任何UPDATE事件)。

功能程式碼將是這樣的:

CREATE OR REPLACE FUNCTION synchronize()
RETURNS trigger AS
$$
   import psycopg2

   conn = psycopg2.connect("host=... dbname=... user=... password=...")
   cur = conn.cursor()

   # If inserting...
   if TD['event'] == 'INSERT':
     cur.execute(...)

   # If deleting...
   if TD['event'] == 'DELETE':
     cur.execute(...)

   conn.commit()
   cur.close()
   conn.close()
$$
LANGUAGE 'plpython2u' VOLATILE;

然後,我定義了兩個觸發器:

CREATE TRIGGER replica_insert
AFTER INSERT ON users
FOR EACH ROW
EXECUTE PROCEDURE synchronize();

CREATE TRIGGER replica_delete
BEFORE DELETE ON users
FOR EACH ROW
EXECUTE PROCEDURE synchronize();

也許過於復雜或不完整,但現在這是我找到的最簡單的方法。如果有人改進它或有替代(最好是本地)方式來做,我會很高興改變接受的答案。

引用自:https://dba.stackexchange.com/questions/127034