对于此操作,ORA-02069 global_names参数必须设置为TRUE

时间:2011-01-14 06:59:57

标签: oracle

我搜索了几个解决方案。其中之一如下:

原因 需要远程映射语句,但无法实现,因为global_names应设置为TRUE才能实现

动作 如果可能,发出alter session set global_names = true

但我不明白为什么我需要设置global_names参数...为什么远程映射使用global_names参数?拜托,你能解释一下吗?

PS我知道设置global_names参数会产生全局命名规则,数据库链接名称必须与远程数据库名称相同。它还会将域名附加到数据库名称,如< DB_NAME>。< DB_DOMAIN>还有什么?

4 个答案:

答案 0 :(得分:9)

这里讨论答案:http://dba010.wordpress.com/2011/01/05/oracle-errorsora/#ORA-02069

如果链接不起作用:

错误:

ORA-02069:此操作的global_names参数必须设置为TRUE

<强>原因:

您正尝试使用本地功能在远程数据库上进行DML操作。

这是“Oracle Bug”,它应该可以工作,但事实并非如此。

示例(为了更好地理解):

- 假设我们有两个数据库DB1和DB2

-On DB1我们有函数fun1

create function fun1 return number is
begin
return 1;
end;

-On DB1我们有一个引用DB2的数据库链接,为简单起见,称为DB2。

- 检查它是否有效。

select *
from dual@DB2

- 如果输出如下,则可以正常工作。

DUMMY
-----
X

-Let在DB2中创建测试表(连接到DB2数据库)

create table tesTable(
id         number,
testColumn number
);

-Let进行一些DML操作,这会导致ORA-02069错误。

insert into testable@DB2(id,testColumn)
values(1, fun1);



“ORA-02069: global_names parameter must be set to TRUE for this operation”

现在,当您已经知道在什么情况下发生此错误时,让我们编写解决方案。它有两个解决方案:

解决方案一:

  1. 将global_names参数设置为true,可以在系统级别或会话级别完成(考虑有时会话级别不可用)
  2. - 在DB1上

    alter session set global_names=true;
    
    1. 在远程数据库上创建数据库链接,在我们的例子中是DB2,它将引用数据库DB1(使链接名称与数据库全局名称相同,因为将global_names参数设置为true需要它)。
    2. - 在DB2上

      Create database link DB1 connect to <username> identified by <password>
      using ‘DB1’;
      

      现在它应该可行,但我应该提一下,创建数据库链接可能不是更可取的,

      因为它不安全(你应该猜到为什么,因为如果你这样做,你将能够  通过数据库链接与某些用户连接到DB1 ...如果对您没有关系,则使用它.J)。

      解决方案二:

      1. 在本地数据库上创建临时表。
      2. 将行插入临时表。
      3. 将临时表中的临时行插入远程数据库。
      4. 删除临时行。 请注意,此解决方案比第一个解决方案慢。但它也解决了问题并且更加安全。

答案 1 :(得分:2)

kupa的回答也提供了很好的解释和良好的解决方案,但是如果你不想或不能在那里关注一两个解决方案,我建议在这里查看解决方案2:http://dbtricks.com/?p=263

这对我有用,创建一个变量并为其分配本地函数的值,然后使用引用远程表的sql语句中的变量。

希望这有助于帮助我的人!

答案 2 :(得分:0)

引用this thread

...in the past Oracle used .world as a default domain if domain 
part was not specified in global db name, they changed it (I 
believe in 10g R1, but I'm not sure)

答案 3 :(得分:0)

如果您在远程 SELECT 语句上使用本地函数,请尝试在您的 WHERE 子句中添加 “rownum <> 0”。这样就可以了