postgresql - 触发函数在 UPDATE 上刷新远程物化 View

标签 postgresql

我有以下触发器和触发器函数设置,以便每次更新本地表 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/

相关文章:

ruby-on-rails - 如何指定 heroku 的 MIME 类型?

python - 使用 Python 备份 Postgresql 数据库

postgresql - 创建临时表,当我结束事务时该表会自行删除

laravel - 如何在 Laravel 中收听 Postgres 监听/通知?

ruby-on-rails - rails : How to use scope to find an element in array of arrays

python - 每个结果的多个子查询,如何更快?

ruby-on-rails - Activerecord:为表使用别名时出现类型错误

postgresql - 需要明智地选择员工部门的平均年龄

Perl 和 PostgreSQL 转义 $

json - PostgreSQL 递归行到 JSONB 映射