我想在一个中央数据透视数据库上同步3个Postgresql数据库。
例如,如果我在DB1中插入一行,它将发送一个扩展名为postgresql_fdw的查询以透视db,并且它将插入查询发送到db2和db3。我在每个数据库中用after insert
创建了3个触发器。
问题:如果我在db1中插入,则数据透视表将此查询发送到db2和db3,后者触发其触发器以插入到db2和db3中作为回报。无限循环 :)。我该如何解决这个问题?
答案 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.