2017-10-18 31 views
1

ローカルテーブルAが更新されるたびに、リモートサーバ上のMATERIALIZED VIEWをリフレッシュするために、以下のトリガとトリガ機能の設定があります。 MVは、ローカル表Aの外部表から作成されます。トリガーが実行された後、マテリアライズド・ビューは更新されますが、UPDATEが発生する前の状態にのみ更新されます。なぜこれが当てはまるのか分かりません。トリガー機能は、UPDATEがコミットされる前に実行されますが、それはトリガーの 'AFTER'部分のためのものでなければなりません。または、MVリフレッシュが高速(?)ですが、pg_sleepを追加しても結果は変わりません。UPDATEでリモートマテリアライズドビューをリフレッシュするトリガー機能

CREATE OR REPLACE FUNCTION public.refresh_remote_mv() 
RETURNS TRIGGER AS 
$func$ 
BEGIN 
PERFORM dblink_connect('remote_server'); 
PERFORM dblink_exec(
$$ 
REFRESH MATERIALIZED VIEW m_config; 
$$); 
PERFORM dblink_disconnect(); 
RETURN NULL; 
END 
$func$ LANGUAGE plpsql; 

トリガー:

ためだ
CREATE TRIGGER tr_remote_refresh 
AFTER UPDATE ON m_config 
EXECUTE PROCEDURE refresh_remote_mv() 

答えて

1

トランザクション分離(変更内容はすべてのトリガーが発射された後にコミットされるので、データベース・リンクから別のトランザクションがそれを表示されません)。

マテリアライズド・ビューは、すべての変更ではなく、ある頻度でリフレッシュする方がよいでしょう。しかし、あなたがdblinkクエリをasync dblinkクエリに変更することができないようにするなら、それはうまくいくはずです(トランザクションがコミットされたことを確認するために少し遅れて起動してください)。

+0

洞察をいただきありがとうございます!私はdblink_send_query https://www.postgresql.org/docs/9.5/static/contrib-dblink-send-query.htmlに行った – Cyrus

関連する問題