利用Oracle快照dblink解决数据库表同步问题
本实例已完全通过测试,单向,双向同步都可使用.
名词解释:源?? ——被同步的数据库
?????????????? 目的——要同步到的数据库
前6步必须执行,第6以后是一些辅助信息
?
1、在目的数据库上,创建dblink
CREATE OR REPLACE TRIGGER BST114.TRI_TEST_USER_AFRAFTER DELETE OR INSERT OR UPDATEON BST114.SN_TEST_USER REFERENCING NEW AS NEW OLD AS OLDFOR EACH ROWdeclare tmp_id number(10):=-1;begindbms_output.put_line('begin');if inserting then --select id into tmp_id from test_user where id=:new.id; for p in(select id from test_user where id=:new.id) loop tmp_id:=p.id; end loop; dbms_output.put_line(tmp_id||'===------------'); if (tmp_id=-1) then insert into test_user(id,name,age) values(:new.id,:new.name,:new.age); end if;end if;if updating then dbms_output.put_line('updated'); for p in(select name,age from test_user where id=:old.id) loop if (p.name!=:new.name) or (p.age!=:new.age) then update test_user set name=:new.name,age=:new.age where id=:old.id; end if; end loop;end if;if deleting then dbms_output.put_line('deleted'); delete from test_user where id=:old.id;end if;dbms_output.put_line('end');end TRI_test_user_AFR;--为防止双向同步触发器死循环,所以要在触发器中增加一些判断,阻止死循环.
?
以上同步原理
1.首先创建一个dblink,可以访问远程数据库
2.在本地创建一个快照,映射远程数据表,当远程数据表有变化时,会反应到快照中.
3.由于快照类似于视图表,所以在本地为快照创建一个触发器,当快照有变化时,会触发相应事件.
4.在触发器中写同步数据的代码.
?
附:快照刷新时间参数说明
一天的秒数=24小时*60分钟*60钞
所以要想在30秒后刷新,参数应该这样写 sysdate+30/(24*60*60)
1分钟==sysdate+60/(24*60*60)
一天的分钟数=24小时*60分钟
一分钟也可以这样写 sysdate+1/(24*60)
30分钟==sysdate+30/(24*60)
60分钟==sysdate+60/(24*60)
以此类推
1小时==sysdate+1/24==sysdate+60/(24*60)
1天==sysdate+1
一个月==sysdate+30
?