关于:ORA-02069: global_names parameter must be set to TRUE for this operation

以如下环境为例子:
数据库A :global_name为 OrcA
数据库B :global_name为 OrcB
  在OrcA中建立dblink连接到OrcB,dblink命名为to_OrcB;
  在OrcB中创建表T,拥有一个number的id字段;
  在OrcA中创建sequence(seq_1);并创建一个function(fun_1),fun_1仅返回1;
来看看发生02069错误的情况:
执行:
   insert into T@to_OrcB(id) values(seq_1.nextval);
   或
   insert into T@to_OrcB(id) values(fun_1);
   
   都会发生 ORA-02069: global_names parameter must be set to TRUE for this operation。(注:update、delete一样)  
可知:通过DBLink更新远程数据的时候,如果使用到本地的sequence、函数、过程、包等将会发生ORA-02069
根据错误信息:
 执行 alter session set GLOBAL_NAMES = true;
 再次执行:insert into T@to_OrcB(id) values(seq_1.nextval);
 发生如下错误:ORA-02085: database link to_OrcB connects to OrcB。
 
 删除DBLink to_OrcB.
 创建名字为OrcB的dbLink连接到OrcB.
 
 执行:insert into T@OrcB(id) values(seq_1.nextval);
 
 ORA-02019: connection description for remote database not found
 ORA-02063: preceding line from OrcB
  现在登录OrcB,创建反向dblink连接到OrcA,注意DBLink的名字必须为OrcA;
  
  这时执行:
  
   insert into T@OrcB(id) values(seq_1.nextval);
   或
   insert into T@OrcB(id) values(fun_1);
   
   成功!
   
总结:
   当发生 ORA-02069错误时,要建立一个反向的dblink,且两个dblink的名字要与global_name一致;
   在执行SQL前,必须先执行alter session set GLOBAL_NAMES = true;
   
上面方法的缺点:
    设置繁琐,如果A、B两个数据库的global_name相同时,无法创建与global_name相同的dblink。
    其次,如果数据A有多个用户要更新数据库B中的一个用户,这个反向DBLink该如何建立呢?
    
另一种的方法:
    使用游标,一条条更新远程对象,更新远程数据的DML中不要引用本地用户对象,而是使用变量来代替。
    如insert into T@to_OrcB(id) values(seq_1.nextval)可以改为
    declare
       i number;
    begin
      select seq_1.nextval into i from dual;
      insert into T@to_OrcB(id) values(i);
    end;
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值