我有本地和远程数据库。 本地数据库是远程数据库的副本。 我必须从远程数据库插入新的记录到本地数据库。 远程数据库中有14个表,所以我需要跟踪所有14个表中的更改。将新记录从一个数据库复制到另一个数据库
我知道我可以选择远程数据库中的每个表,并检查记录是否存在于本地数据库中,如果没有,则插入它。
有没有另一种方法呢?在Java也许? 什么方法是最好的?
我有本地和远程数据库。 本地数据库是远程数据库的副本。 我必须从远程数据库插入新的记录到本地数据库。 远程数据库中有14个表,所以我需要跟踪所有14个表中的更改。将新记录从一个数据库复制到另一个数据库
我知道我可以选择远程数据库中的每个表,并检查记录是否存在于本地数据库中,如果没有,则插入它。
有没有另一种方法呢?在Java也许? 什么方法是最好的?
如果您只有一个本地数据库并且它始终运行 - 您可以使用远程数据库的触发器插入本地数据库。
顺便说一句:从本地手动检查远程手机不是一个好主意。如果现有的远程记录发生了变化,但本地仍然具有旧值?
还有一些Oracle工具可以在数据库之间进行复制和同步。最好挖掘它。
我没有访问远程数据库,只有选择,并授予更新权限。是的,我认为我需要同步。你知道哪些工具最简单易用吗? – user1598696
对不起,我在那个地区工作了很久,可能不知道最新的。无论如何,技术或工具有DBA,你不能将它们作为一个简单的用户应用(只有SELECT和UPDATE权限)。 – Vadim
让我们DBLINK开始远程DB
CREATE PUBLIC DATABASE LINK REMO
CONNECT TO <user_name>
IDENTIFIED BY <password>
USING '<service_name>';
然后用循环在从用户模式中的所有表的插入。或者,如果您只想插入一些表格,请为这14个表格定义适当的条件。
begin
for x in (select table_name from user_tables) loop
execute immediate 'insert into ' || x.table_name || ' (select * from ' || x.table_name || '@REMO minus select * from ' || x.table_name || ')';
commit;
end loop;
end;
/
这将只插入新记录(实际上存在(或已被更改)在远程上并且不存在于本地的记录)。如果这是你需要的,这将起作用。如果你需要同步,这不是解决方案。
谢谢,我会尽力让你知道 – user1598696
恕我直言:这是适当的解决方案。它也可以扩展到某种“同步”解决方案,以使本地DB与远程DB在定期运行(例如)运行时同步。 – Vadim
我认为数据库管理系统更快速和安全,如果你想通过抛出Java,也许这可能需要时间,你试过dblink为例? –
速度是问题中最少的。考虑两个DB之间的同步和一致性... – FDavidov
什么是数据量?与数十亿条记录的14个表相比,14个表中的几百条记录是一个不同的(而且是微不足道的)问题。 –