[英]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.