现在有一个数据库A,通过dblink访问远程数据库B,在A中有触发器,当A中的表数据发生变化时,通过触发器将数据更新到B中,触发器如下:
create or replace trigger tr_AQSC_COMPANY_insupd
after INSERT OR update on company
for each row
DECLARE
iCount int;
begin
select count(*) into iCount from COMPANY@ODSDBLINK where id=:new.id;
if iCount>0 then
update COMPANY@ODSDBLINK set NAME=:new.Name,Type=:new.Type,Remark=:NEW.REMARK,SHORT_NAME=:NEW.SHORT_NAME,LAST_UPDATE_DATE=sysdate
where id=:new.ID;
else
insert into COMPANY@ODSDBLINK
(ID,NAME,TYPE,REMARK,SHORT_NAME) values(:NEW.ID,:NEW.NAME,:NEW.TYPE,:NEW.REMARK,:NEW.SHORT_NAME);
end if;
end tr_AQSC_COMPANY_insupd;
该触发器的理想运行状态是网络状态良好,但是如果网络连接出现异常,该怎样处理呢?
------解决方案--------------------
看样子id是主键。那么我个人建议分两步做:
1 触发器的实现功能是将新插入的记录的id插入到一个tmp中。
2 创建一个存储过程。存储过程每分钟运行一次,读入tmp表。有id记录就将查找company这个id记录更新到COMPANY@ODSDBLINK并删除记录。无记录则什么都不做。
3 如果你的系统不是实时性或实时性不高的话可以尝试这种方法。