首页 > 解决方案 > 如何避免使用 postgres_fdw 在数据库之间触发无限循环?

问题描述

数据库架构

我想在一个中央枢轴数据库中同步 3 个 Postgresql 数据库。

例如,如果我在 DB1 中插入一行,它会发送一个查询到带有扩展 postgresql_fdw 的数据透视数据库,并将插入查询发送到 db2 和 db3。我after insert在每个数据库中创建了 3 个触发器。

问题:如果我在 db1 中插入,则枢轴将此查询发送到 db2 和 db3,它们触发它们的触发器以插入 db2 和 db3 作为回报。无限循环 :)。我怎么解决这个问题?

标签: postgresqltriggersreplication

解决方案


通常,您可以使用 来检查嵌套级别pg_trigger_depth()

喜欢:

CREATE TRIGGER my_sync_trigger
BEFORE INSERT ON my_table
FOR EACH ROW 
WHEN (pg_trigger_depth() < 1)    -- cancel nested trigger invocation!
EXECUTE PROCEDURE my_sync_function();

但是我没有postgres_fdw跨数据库测试过这个。我怀疑它在数据库中透明地工作。你必须测试...

穷人的解决方案是replicated为每个表添加一个布尔标志,在复制行时将其设置为 true,并且仅在它不为 true 时触发复制触发器。

...
WHEN (NEW.replicated = false)    -- cancel for replicated rows
...

但是我可以在多用户环境中看到各种并发问题。

您是否考虑过一种经过验证的复制解决方案在此处的手册中查找列表。


推荐阅读