目前在做一个功能:数据库双机热备份,采用dblink和触发器来实现两个数据库同步,但是在同步插入操作主数据库中一张带有blob字段表的时候出现了问题,oracle的触发器不可以直接访问远程表的blob字段,会报错:无法使用从远程表选择的 lob 定位器。
解决方法如下:1,在本地数据库创建一个结构和含有blob字段表相同的临时表。
              2,把新插入的数据插入到临时表中。
              3,再把临时表的数据用insert into remoteTable@dblink_name  select * from temp的形式插入到远程数据库中示例代码如下:
              CREATE GLOBAL TEMPORARY TABLE temp as select * from test(含有blob字段,字段名为file) where 1=2;
             触发器:
             create or replace trigger test_trigger
             after insert  on test
             for each row
             begin
             if inserting then
              insert into temp (id,file,name) values (:new.id,:new.file,:new.name);
              insert into test@dblink_name  select * from temp(只能用select * 的方式来插入,不然会报错)
where id=:new.id;
end if;
end;

解决方案 »

  1.   

    嗯,触发器里面不要select * from temp; 方式不太好,万一temp表数据量大的话,会严重影响数据库的性能的。
      

  2.   

    新思路,学习学习。
    blob字段备份一直不方便
      

  3.   

    再把临时表的数据用insert into remoteTable@dblink_name  select * from temp的形式插入到远程数据库中 
      这个怎么样
      

  4.   

    1 hao ,very good, good luck to you
      

  5.   


    temp表只是个临时表,在commit以后里边数据会被清空掉(测试过了),所以不会出现这种情况,它相当于一个临时中转站
      

  6.   


    那你怎么保证这个临时表temp里面的数据全是你insert into的呢?万一别的oracle用户或者系统用户insert into temp的话,你怎么办呢?
      

  7.   

    insert 这样做可以,我试了,但是若是update,怎么做啊
      

  8.   

    不用中间表直接insert也是可以成功,不过我的是写在存储过程里面的,为什么要加中间表~
      

  9.   

    项目中碰到楼主类似的问题,从远程导入Blob字段失败。感谢。
      

  10.   

    这个方法我试了怎么不行啊,数据能同步,blob字段是空的啊求解释