有两个数据库,里面的表和结构相同,但是这两个数据库本身不能相互连接
所以我想了一个方法,就是将需要进行同步的表都创建一个触发器,在表数据发生时,向一张动作表(action表)中插入数据,然后再用一个中间程序,去取action表中的数据,根据这个数据去更新另外数据库的数据
但是这样会有一个问题,如果同一张表,两边都要同步,因为触发器的原因,就会产生无限循环
例如在A数据库中对表aa插入一条数据,这时触发器会向action表中添加一条数据,然后中间的程序提取到这条数据后,会向B数据库中的aa插入相同的数据,但同时,它的触发器也会向B数据库中的action表添加一条数据,这样的话就没完没了了……也不知道我说明白了没有,请各位高手多多指点

解决方案 »

  1.   

    插入前先判断这条数据有没有已经插入。
    另外用dblink连接不可以吗?
      

  2.   

    回nGX20080110:中间程序就是根据action表里面的数据来提取数据的,action表中会记录发生变化的表名、时间、主键等信息,根据这些信息再去对应的表中取出对应的数据,然后同步到另一个数据库中
      

  3.   

    回vber1010:在插入之前判断的话,这样相当于数据已经走了一圈又回来了(从A到B再到A),我是想问有没有什么方法,在从A到B的时候就不让这条数据在插入时触发触发器,这样的话在从A到B时就解决这个问题了,另外两台数据库之间本身是不能连接的,所以不能用dblink
      

  4.   


    添加flg, --> 未添加:1,添加完成:2
    触发器加条件:for each row when(new.flg=1)
    A数据库中对表aa插入一条数据,(設定:A数据库aa表的flg=1)
    这时触发器会向action表中添加一条数据,(設定:action表的flg=1)
    然后中间的程序提取到这条数据后,(設定:数据的flg=2)
    会向B数据库中的aa插入相同的数据,(現在:B数据库aa表的flg=2)
    但同时,它的触发器也会向B数据库中的action表添加一条数据,(現在:flg=2,不満足触发器条件)
      

  5.   

    回shan1119:感谢您的建议,您的这种方法我想到了,但是我们这里每个库里有将近100张表,给每个表都增加一个字段,同时还要对数据库上的应用系统程序进行修改,动作太大了,所以暂时没有考虑
      

  6.   

    其实我现在最想知道的就是oracle能不能就像在sql语句中给数据加锁一样(select * from table FOR UPDATE),在语句中增加什么内容而使触发器对本次操作不执行。或者有什么方法可以防止另一端的触发器执行