繁体   English   中英

如何使用postgres_fdw避免数据库之间的触发器无限循环?

[英]How to avoid infinite loop with triggers between databases using postgres_fdw?

数据库模式

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

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

问题:如果我在db1中插入,则数据透视表将此查询发送到db2和db3,后者触发它们的触发器以返回到db2和db3中。 无限循环 :)。 我怎么解决这个问题?

通常,您可以使用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,并且仅在不正确时才触发复制触发器。

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

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

您是否考虑过一种成熟的复制解决方案 在此处找到手册中的列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM