postgresql - 如何避免使用 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,并且仅在它不为 true 时触发复制触发器。
...
WHEN (NEW.replicated = false) -- cancel for replicated rows
...
但是我可以在多用户环境中看到各种并发问题。
您是否考虑过一种经过验证的复制解决方案?在此处的手册中查找列表。
推荐阅读
- android - Appcelerator Studio - 无法在设备上运行但在 genymotion 模拟器中运行良好?
- ruby-on-rails - UserMailer:Class 的未定义方法“with”
- java - 在硒中拖放时元素会重叠
- c# - 当我通过 Process.Start c# 运行控制台时,控制台关闭
- python - 类中的 Python 函数递归
- c++ - 用 C++ 播放音乐
- javascript - {{}} 内的值未以角度更新
- apache-spark - 通过 Spark RDD 或 SQL API 中的每个空行将多行收集到一个数组中
- r - R中两个分区之间的距离
- ruby - 在 Ubuntu 上安装 Nokogiri 失败