我有一个位于远程服务器上的数据库,每次我都会进行转储,然后将其复制到本地服务器。在我工作期间,我对此本地副本进行了更改。当我从远程服务器重新加载数据库时,我想保留这些更改。
我一直在考虑的一个选项是拥有两个具有相同表的数据库(local_xyz和remote_xyz)。来自远程服务器的数据被加载到remote_xyz中并被设置为只读。所有更新和新数据都写入local_xyz。选择在两个数据库上执行,并且联合完成local_xyz和remote_xyz。
这似乎是一个复杂的解决方案,需要我更改所有查询以获得联合。我希望还有另一种方法来实现这一目标。任何提示/建议?
答案 0 :(得分:1)
我使用可能对您有所帮助的视图做了快速POC。您必须更改所有select
语句才能点击local_merge
,并且您的insert
和update
语句必须点击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;