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

时间:2018-07-22 14:08:49

标签: postgresql triggers replication

schema of databases

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

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

问题:如果我在db1中插入,则数据透视表将此查询发送到db2和db3,后者触发其触发器以插入到db2和db3中作为回报。无限循环 :)。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

通常,您可以使用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
...

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

您是否考虑过经过验证的复制解决方案之一Find a list in the manual here.