Postgresql
PostgreSQL 中是否有某種表級複製?
我在 PostgreSQL 9.1 中使用兩個數據庫,比如A和B,每個應用程序一個。數據庫B需要讀取(而不是寫入)數據庫A中的一個表(比如users),但同時數據庫B中的一些表需要引用它們的一些欄位作為表users上的外鍵。
到目前為止,我已經嘗試過:
- 查找某種本機表級複製,因此使用者的任何更改都會自動複製到數據庫B中的複製表中。什麼也沒找到。
- 創建一個
TRIGGER
表使用者,以便在任何更改後呼叫一個函式,但這並不能解決任何問題,因為我無法將數據庫A中的值插入到數據庫B的表中。- 使用
FOREIGN TABLE
s。兩者都沒有解決它,因為沒有外鍵可以應用於外表。- 使用 a
SCHEMA
而不是A,但應用程序將其強制為數據庫DATABASE
。- 我什至考慮過每分鐘都有一個 CRON 將表從A轉儲並導入到B,但這會破壞與其他表的任何外鍵關係。
我不能將兩個數據庫合二為一(儘管從技術上講,它們都有唯一命名的表),因為當升級其中一個時,它會檢查數據庫,如果其中有任何奇怪的東西,它就會失敗。
我在這裡還有其他機會嗎?任何提示都非常感謝。
我終於設法找到了迄今為止有效的解決方案。我
plpython
隨模組一起安裝了過程語言模組psycopg2
,編寫了一個FUNCTION
並創建了兩個TRIGGER
s,一個用於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();
也許過於復雜或不完整,但現在這是我找到的最簡單的方法。如果有人改進它或有替代(最好是本地)方式來做,我會很高興改變接受的答案。