您的位置:首页 > 产品设计 > UI/UE

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

2016-11-22 16:12 936 查看
以如下环境为例子:

数据库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;

        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐