我这里装了一个linux版本的oracle,其中一个表A要与另外一个oracle的一个表B同步,由于特殊原因,不可以使用,也不可能使用oracle提供的同步服务,请不要问我原因。
所以我想写一个中间层程序,时刻监控表A是否有更新。这样时刻监控表A有很多麻烦的地方,浪费资源,因为表A也不算小。因此我打算为表A写一些触发器,这样一旦表A有改动我就知道了,现在问题是怎么在触发器中可以让我的程序知道表A有改动?我想过在触发器中通过utl_file,text_io输出一个标志文件,但是我又不知道写linux程序,只知道写windows程序。不知道上面的utl_file,text_io能不能输出文件到我当前程序的机子上面。或者再建一个表B,程序监控表B。当A有改动时,在触发器内中,将表A有改动的标识写入表B中。这样表B也不大。或者不知道oracle本身就有没有通知我程序的方法,比如一些函数命令等。关键是可以让程序第一时间得到表A有改动的通知。我的程序应该是ado直接连接oracle。请大家各抒己见,出谋划策,谢谢。

解决方案 »

  1.   

    哦,写错了一点点,后面的表B是表A在同一个oracle库中,与最上面的表B不为同一个表.请大家别误解.
      

  2.   

    或者再建一个表B,程序监控表B。当A有改动时,在触发器内中,将表A有改动的标识写入表B中。这样表B也不大。 
    -------------------------------
    这种方式好像比较容易实现一些。
      

  3.   

    事情这样做的话就做反了,应该是你的前台程序做对A表的操作时在同一个TRANSACTION中往B表中写入,两个操作一起提交或回滚,这样可以保证数据完整;
    也可以直接在数据库写trigger,只要A表有操作就直接同步修改B表,这样做也可以保证数据完整性,效率差不多;
    如果同步必须要人工干预(如生产中A流程完成后及时通知B流程操作员开始),那么就在前台或应用服务程序中通过消息机制直接实现,这样还可以减轻数据库服务器的负担
      

  4.   

    不能用同步,是不是说,数据库连接也不可以呢?可以的话,直接使用数据库连接是最快的了。看LZ想自己做一个中间层,其实很多方法可以用。
    假如使用utl_file的话,可以建立linux系统的samba系统。用来连接windows系统。
    除了utl_file,还有smtp,tcp的包等等。
    都可以用来实现LZ想做的事情。
    或者使用系统监察,你可以检查系统的监察纪录。也可以。
    但是,真的需要用到吗?决定写触发器的话,数据真的很多的话,尽量不要用得太复杂了。万一网络呀,或者其他问题出现了。
      

  5.   

    数据库连接在网络不稳定情况比较容易让同步机制失效,我觉得“或者再建一个表B,程序监控表B。当A有改动时,在触发器内中,将表A有改动的标识写入表B中。这样表B也不大。”应该可以。因为LZ有说不能用数据库同步,如果我做我会用远程数据库连接+Oracle JOB也和LZ的思路一样,如果A表比较大,就创建一张状态表,以达到优化性能的目的