Postgresql 使用DBlink同步postgres中的两个表

Postgresql 使用DBlink同步postgres中的两个表,postgresql,dblink,Postgresql,Dblink,我希望在两个不同的服务器(server1和server2)中有两个同步的DB,因此: server1中的table1在server1中的table1更新server2中的table1 变化 及 server2中的table1在server2中的table1更新时更新server1中的table1 变化 通过这种方式,当从两台服务器更新时,我可以同步两个表,我成功地使用DBlink从server1更新到server2,没有任何问题 有什么问题?当两个表都启用了触发器时,它会创建一个无限循环

我希望在两个不同的服务器(server1和server2)中有两个同步的DB,因此:

  • server1中的table1在server1中的table1更新server2中的table1 变化

  • server2中的table1在server2中的table1更新时更新server1中的table1 变化
通过这种方式,当从两台服务器更新时,我可以同步两个表,我成功地使用DBlink从server1更新到server2,没有任何问题

有什么问题?当两个表都启用了触发器时,它会创建一个无限循环,这样server1将打开,然后更新server2,然后更改并更新server1,依此类推。 有没有一种方法可以在没有这个问题的情况下满足我的需求


谢谢。

通过表1中的一个附加字段(标志)和一个有条件执行的触发器,这个问题很容易解决

将新列添加到表中:

alter table table1 add column sync boolean default false;
在触发功能中,将
sync
设置为
true

create function on_update_table1()
...
--  update table1 on another server with dblink setting sync = true
...
使用条件创建触发器:

create trigger on_update_table1
after update on table1
for each row when (not new.sync)
execute procedure on_update_table1();
只有当来自另一台服务器的触发器未执行更新时,才会触发该触发器

但是请注意,在建议的同步方法中,您可能会遇到更困难的问题。特别是,您应该知道如何解决两台服务器上同时更改同一行的冲突。只有在设计时消除了此类冲突,或者必须实现自己的锁定系统时,才能应用同步,这可能是一个相当复杂的问题