我有以下触发器和触发器函数设置,以便每次更新本地表 A 时刷新远程服务器上的物化 View 。 MV 又是从本地表 A 的外部表创建的。触发器运行后,物化 View 会更新,但是,它仅更新到 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()
最佳答案
这是因为事务隔离(您的更改将在所有触发器触发后提交,因此 dblink 中的另一个事务将看不到它)。
最好以一定的频率刷新物化 View ,而不是每次更改都刷新。但是,如果您不想这样做,您可以将 dblink 查询更改为异步 dblink 查询,那么它应该可以工作(请记住延迟一段时间以确保事务已提交)。
关于postgresql - 触发函数在 UPDATE 上刷新远程物化 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46804153/