只读数据库+本地更改

时间:2013-09-05 02:34:26

标签: sql postgresql

我有一个位于远程服务器上的数据库,每次我都会进行转储,然后将其复制到本地服务器。在我工作期间,我对此本地副本进行了更改。当我从远程服务器重新加载数据库时,我想保留这些更改。

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

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

1 个答案:

答案 0 :(得分:1)

我使用可能对您有所帮助的视图做了快速POC。您必须更改所有select语句才能点击local_merge,并且您的insertupdate语句必须点击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;