溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle存儲(chǔ)過(guò)程報(bào)錯(cuò)ORA-02069: global_names parameter must be set to TRUE for this operation

發(fā)布時(shí)間:2020-07-05 03:55:31 來(lái)源:網(wǎng)絡(luò) 閱讀:1218 作者:hbxztc 欄目:關(guān)系型數(shù)據(jù)庫(kù)

今天開(kāi)發(fā)給發(fā)郵件過(guò)來(lái)說(shuō)一個(gè)存儲(chǔ)過(guò)程想通過(guò)dblink往目標(biāo)庫(kù)insert數(shù)據(jù),但報(bào)錯(cuò)ORA-02069: global_names parameter must be set to TRUE for this operation,想讓我根據(jù)錯(cuò)誤提示在數(shù)據(jù)庫(kù)上修改global_names參數(shù)修改為T(mén)rue。

先來(lái)看看官方文檔是如何介紹這個(gè)參數(shù)的:

GLOBAL_NAMES specifies whether a database link is required to have the same name as the database to which it connects.
If the value of GLOBAL_NAMES is false, then no check is performed. If you use or plan to use distributed processing, then Oracle recommends that you set this parameter to true to ensure the use of consistent naming conventions for databases and links in a networked environment.

從下面的查詢可以看出global_names參數(shù)可以在線進(jìn)行修改的

zx@TEST>col name for a30
zx@TEST>select name,ISSES_MODIFIABLE,ISSYS_MODIFIABLE from v$parameter where name='global_names';

NAME			       ISSES_MODIFIABL ISSYS_MODIFIABLE
------------------------------ --------------- ---------------------------
global_names		       TRUE	       IMMEDIATE

看完了這個(gè)參數(shù),再來(lái)看看開(kāi)發(fā)的存儲(chǔ)過(guò)程代碼,其中insert語(yǔ)句中是用到了一個(gè)序列,所以導(dǎo)致了這個(gè)報(bào)錯(cuò)。先在測(cè)試數(shù)據(jù)庫(kù)上創(chuàng)建了一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程來(lái)模擬現(xiàn)再這個(gè)問(wèn)題

創(chuàng)建一個(gè)dblink

zx@TEST>create database link link_orcl connect to zx identified by "zx" using 'orcl';

Database link created.

zx@TEST>select * from dual@link_orcl;

DUM
---
X

先創(chuàng)建一個(gè)不帶序列的遠(yuǎn)程insert的存儲(chǔ)過(guò)程

zx@TEST>create or replace procedure pro_a as
  2  begin
  3  insert into t2@link_orcl (c1) values('a');
  4  commit;
  5  end;
  6  /

Procedure created.

執(zhí)行這個(gè)存儲(chǔ)過(guò)程,觀察結(jié)果,數(shù)據(jù)可以正常插入

zx@TEST>select * from t2@link_orcl;

no rows selected

zx@TEST>exec pro_a;

PL/SQL procedure successfully completed.

zx@TEST>select c1 from t2@link_orcl;

C1
---
a

創(chuàng)建一個(gè)序列,并修改上面的存儲(chǔ)過(guò)程

zx@TEST>create sequence seq_a;

Sequence created.

zx@TEST>create or replace procedure pro_a as
  2  begin
  3  insert into t2@link_orcl (c1,n1) values('a',seq_a.nextval);
  4  commit;
  5  end;
  6  /
  
Procedure created.

執(zhí)行修改后的存儲(chǔ)過(guò)程,重現(xiàn)上面的錯(cuò)誤ORA-02069

zx@TEST>exec pro_a;
BEGIN pro_a; END;

*
ERROR at line 1:
ORA-02069: global_names parameter must be set to TRUE for this operation
ORA-06512: at "ZX.PRO_A", line 3
ORA-06512: at line 1

先在session層面修改global_names參數(shù),再次執(zhí)行存儲(chǔ)過(guò)程,又出現(xiàn)了新的錯(cuò)誤:說(shuō)兩端的數(shù)據(jù)庫(kù)名不一致。

zx@TEST>alter session set global_names = true;

Session altered.

zx@TEST>exec pro_a;
BEGIN pro_a; END;

*
ERROR at line 1:
ORA-02085: database link LINK_ORCL connects to ORCL
ORA-06512: at "ZX.PRO_A", line 3
ORA-06512: at line 1

zx@TEST>!oerr ora 2085
02085, 00000, "database link %s connects to %s"
// *Cause: a database link connected to a database with a different name.
//  The connection is rejected.
// *Action: create a database link with the same name as the database it
//  connects to, or set global_names=false.

那現(xiàn)在問(wèn)題來(lái)了,實(shí)際生產(chǎn)中源端和目標(biāo)端的數(shù)據(jù)庫(kù)名肯定是不一致的,所以修改這個(gè)參數(shù)并不能解決這個(gè)問(wèn)題。

只能想其他的辦法來(lái)繞過(guò)這個(gè)錯(cuò)誤,這里給開(kāi)發(fā)提了兩個(gè)建議:

1、把存儲(chǔ)過(guò)程部署到目標(biāo)端來(lái)避免遠(yuǎn)程insert中調(diào)用sequence

2、在源端存儲(chǔ)過(guò)程中引入臨時(shí)表,先把數(shù)據(jù)插入臨時(shí)表,再?gòu)呐R時(shí)表插入到遠(yuǎn)端表。


在MOS上搜到了一個(gè)相關(guān)文檔(ORA-02069 DURING REMOTE INSERT OF A LOCAL SEQUENCE (文檔 ID 1047673.6))跟我們的問(wèn)題描述一致。


官方文檔:http://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams098.htm#REFRN10065


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI