0

我有一个位于远程服务器上的数据库,我经常做一个转储,然后复制到我的本地服务器。在我的工作中,我对这个本地副本进行了更改。当我从远程服务器重新加载数据库时,我想保留这些更改。

我一直在考虑的一种选择是让两个数据库(local_xyz 和 remote_xyz)具有相同的表。来自远程服务器的数据被加载到 remote_xyz 并设置为只读。所有更新和新数据都写入 local_xyz。选择在两个数据库上执行,并由 local_xyz 和 remote_xyz 完成。

这似乎是一个复杂的解决方案,需要我更改所有查询以拥有联合。我希望有另一种方法来实现这一点。任何提示/建议?

4

1 回答 1

1

我已经使用可能对您有所帮助的视图完成了快速 POC。您必须将所有select语句更改为 hit local_merge,并且您的insertandupdate语句必须 hit local_changes(尽管您可能已经这样做了)。

create table remote (
    id serial primary key,
    val varchar(20),
    update_ts timestamp
);

create table local_changes (
    id integer primary key,
    val varchar(20),
    update_ts timestamp
);

insert into remote (val, update_ts) values ('Hello', current_timestamp);
insert into remote (val, update_ts) values ('Hello, Europe', current_timestamp);
insert into local_changes values (2, 'Hello, World!', current_timestamp);

create or replace view local_merge as
select remote.id, 
   case 
       when remote.update_ts > local_changes.update_ts 
           or local_changes.update_ts is null
           then remote.val
       else local_changes.val
   end as val,
   case 
       when remote.update_ts > local_changes.update_ts 
           or local_changes.update_ts is null
           then remote.update_ts
       else local_changes.update_ts
   end as update_ts
from remote left join local_changes
on remote.id = local_changes.id
;

-- example select
select * from local_merge where id = 2;
于 2013-09-08T02:37:56.623 回答