触发函数以刷新UPDATE上的远程物化视图

时间:2017-10-18 06:39:46

标签: postgresql

我有以下触发器和触发器功能设置,以便每次更新本地表A时刷新远程服务器上的MATERIALIZED VIEW。反过来,MV是从本地表A的外表创建的。触发器运行后,物化视图会更新,但只会更新到UPDATE发生之前的状态。我不确定为什么会这样。触发器功能在提交UPDATE之前运行,但这应该是' AFTER'触发器的一部分用于,对吧?或者MV刷新是快速(?),但添加pg_sleep并不会改变结果。

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 个答案:

答案 0 :(得分:1)

那是因为事务隔离(你的更改将在所有触发器被触发后提交,因此dblink的另一个事务将看不到它)。

最好以某种频率刷新物化视图,而不是每次更改。但是,如果你不想这样做,你可以将你的dblink查询更改为异步dblink查询,它应该工作(请记住解雇它以确保提交事务)。