Postgresql 在更新时刷新远程物化视图的触发器函数

Postgresql 在更新时刷新远程物化视图的触发器函数,postgresql,Postgresql,为了在每次更新本地表a时刷新远程服务器上的物化视图,我设置了以下触发器和触发器函数。MV依次从本地表a的外部表创建。触发器运行后,物化视图将更新,但是,它仅更新到更新发生之前的状态。我不知道为什么会这样。触发器函数在提交更新之前运行,但这应该是触发器的“之后”部分的作用,对吗?或者MV刷新太快(?),但添加pg_睡眠不会改变结果 CREATE OR REPLACE FUNCTION public.refresh_remote_mv() RETURNS TRIGGER AS $func$ BEGI

为了在每次更新本地表a时刷新远程服务器上的物化视图,我设置了以下触发器和触发器函数。MV依次从本地表a的外部表创建。触发器运行后,物化视图将更新,但是,它仅更新到更新发生之前的状态。我不知道为什么会这样。触发器函数在提交更新之前运行,但这应该是触发器的“之后”部分的作用,对吗?或者MV刷新太快(?),但添加pg_睡眠不会改变结果

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()

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


最好以一定频率刷新物化视图,而不是每次更改都刷新。但是,如果您不想这样做,您可以将dblink查询更改为异步dblink查询,然后它应该可以工作(请记住延迟触发它,以确保事务已提交)。

感谢您的帮助!我使用了dblink\u send\u查询