日期:2014-05-17  浏览次数:20959 次

oracle dblink
现在有一个数据库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 如果你的系统不是实时性或实时性不高的话可以尝试这种方法。