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

通知
我这里装了一个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。

请大家各抒己见,出谋划策,谢谢。

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

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

看LZ想自己做一个中间层,其实很多方法可以用。
假如使用utl_file的话,可以建立linux系统的samba系统。用来连接windows系统。
除了utl_file,还有smtp,tcp的包等等。
都可以用来实现LZ想做的事情。
或者使用系统监察,你可以检查系统的监察纪录。也可以。
但是,真的需要用到吗?

决定写触发器的话,数据真的很多的话,尽量不要用得太复杂了。万一网络呀,或者其他问题出现了。
------解决方案--------------------
关注
------解决方案--------------------
数据库连接在网络不稳定情况比较容易让同步机制失效,我觉得“或者再建一个表B,程序监控表B。当A有改动时,在触发器内中,将表A有改动的标识写入表B中。这样表B也不大。”应该可以。

因为LZ有说不能用数据库同步,如果我做我会用远程数据库连接+Oracle JOB也和LZ的思路一样,如果A表比较大,就创建一张状态表,以达到优化性能的目的