远程数据库有一个表 a(a,b,c,d)
本地数据库有一个表 atmp(a,b,c,d)现在在本地创建一个触发器
create or replace trigger trg_insert_atmp
  after insert on a@yuanchengDB  
  for each row declare
 begin 
 insert into atmp ··········; 
end trg_insert_atmp;
如何当远程a表更新时候,会自动将a表更新的行复制插入到本地的atmp中呢!(表里的字段都是没特点的)另外这个表每天晚上2点更新1万左右,用触发器好还是用job好呢!

解决方案 »

  1.   

    将触发器写在远程库里
    在远程库配一个“本地”的dblink
      

  2.   


    用物化视图比较方便Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。 物化视图可以查询表,视图和其它的物化视图。
    通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。
    对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
    对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。
    在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。... ...具体操作,参考blog
    物化视图
    http://blog.csdn.net/tianlesoftware/archive/2009/10/23/4713553.aspx
      

  3.   

    不行呢,我的dbLink只能在本地,远程数据库我们只有查看的权限,所以操作都只能在本地oracle上··
      

  4.   

    如果仅仅为了查询,用物化视图好。
    否则用job好。
      

  5.   

    好,就算用job···调用存储过程··那么 insert into atmp ???;后面怎么写呢?
    这个才是主要的·· 
      

  6.   

    第一、create or replace trigger trg_insert_atmp after insert on a@yuanchengDB尝试在本地库建立一个对远端库表的触发器,这种思路是完全不对的。所谓触发器,是指在数据库层的一个对象,它的功能是拦截对表的操作。而这种拦截必然是本地库的。事实上,建立在dblink上的远端库的操作,本地库是完全不知情的。第二、当你对于远程库只有读权限的情况下,实现“当远程a表更新时候,会自动将a表更新的行复制插入到本地的atmp中”是不可能的。因为你没有权限从远端库push信息,所以更新只可能是定时的读入而不可能是完全自动的。第三、 不理解“表里的字段都是没特点的”的具体含义,我把它解读为没有主键,也就是说任何列都可能改变。这种情况很少见,没有主键的表在数据库设计的范式中是不合格的。但如果确实是这样的话,解决方案可以用rowid。远端表a (a,b,c,d),在本地表上加一个列rowid
    create atmp (rid rowid, a xx, b xx, c xx);
    同步的时候根据rowid就可以。
    update atmp t 
    set (a,b,c,d) = (select a,b,c,d from a@dblink where rowid=t.rid)
    where exists (select 1 from a@dblink where rowid=t.rid);
    insert into atmp (rid, a,b,c,d)
    select rowid, a,b,c,d
    from a@dblink
    where not exists (select 1 from atmp where rid = a.rowid);这种方式只要在远端库的a表没有重建就不会有问题,如果a表重建,那atmp就得完全刷新。在没有主键的情况下这是没有办法的事情。