2011-01-14 9 views
6

Ho cercato un paio di soluzioni. Uno di loro è il seguente:Il parametro global_names ORA-02069 deve essere impostato su TRUE per questa operazione

Causa Una mappatura a distanza della dichiarazione è richiesta ma non può essere raggiunto a causa global_names deve essere impostato su TRUE per poter essere raggiunto

azione Problema alterare sessione imposta global_names = true se possibile

Ma non capisco perché dovrei impostare il parametro global_names ... Perché il mapping remoto utilizza il parametro global_names? Per favore, puoi spiegarmi?

P.S So che il parametro di impostazione global_names si porrà regole di naming globali, che il nome del collegamento database deve essere lo stesso del name..And database remoto anche aggiunge il nome di dominio per il nome del database come <DB_NAME>. <DB_DOMAIN> cos'altro?

+0

cosa stai cercando di fare (quali linee di codice), quando ottieni questo errore? –

+0

Grazie per la risposta ... Sto cercando di inserire righe via dblink ... parte della mia istruzione sql è questo inserto in tmp_b_transfer_amt @ xl02 select (seleziona acc.acct_no da [email protected] ... – kupa

+0

potresti post codice prima creazione di collegamenti DB usati? (per favore aggiungilo al post originale, non nei commenti) –

risposta

8

La risposta è discusso qui: http://dba010.wordpress.com/2011/01/05/oracle-errorsora/#ORA-02069

Nel caso in cui link non funziona:

errore:

ORA-02069: global_names il parametro deve essere impostato su TRUE per questa operazione

Causa:

Si sta cercando di rendere il funzionamento DML sul database remoto utilizzando la funzione locale.

Questo è il "bug Oracle", dovrebbe funzionare ma non è così.

Esempio (per una migliore comprensione):

-Assume che abbiamo due basi di dati DB1 e DB2

-Su DB1 abbiamo funzione fun1

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

-Su DB1 abbiamo un collegamento al database che si riferisce a DB2 ha chiamato, per semplicità, DB2.

-Verifica che funzioni.

select * 
from [email protected] 

-Se l'output è il seguente, quindi funziona.

DUMMY 
----- 
X 

di creare la tabella di prova in DB2 (la connessione al database DB2) -Let

create table tesTable(
id   number, 
testColumn number 
); 

-Let di fare qualche operazione DML, che dovrebbe causare questo errore ORA-02069.

insert into [email protected](id,testColumn) 
values(1, fun1); 



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

Ora, quando sai già in quale situazione si verifica questo errore, scriviamo la soluzione. Ha due soluzioni:

soluzione one:

  1. Impostare il parametro global_names su true, si può fare a livello di sistema o al livello di sessione (si pensi che il livello di sessione a volte non è disponibile)

--Sulla DB1

alter session set global_names=true; 
  1. Creare il collegamento al database nel database remoto, nel nostro caso su DB2, che farà riferimento al database DB1 (rendere il nome del collegamento uguale al nome globale del database, poiché l'impostazione del parametro global_names su true lo richiede).

-Su DB2

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

Ora dovrebbe funzionare, ma devo dire che la creazione di database link non può essere preferibile,

perché non è sicuro (Si dovrebbe indovinare perché, a causa se lo fai, sarai in grado di connettersi a DB1 con DB2 con qualche utente attraverso il collegamento del database ... se non è importante per te allora usaloJ).

Soluzione due:

  1. Creare tabella temporanea nel database locale.
  2. Inserire la riga nella tabella temporanea.
  3. Inserire la riga temporanea dalla tabella temporanea nel database remoto.
  4. Elimina la riga temporanea. Si noti che questa soluzione è più lenta della prima. Ma risolve anche il problema ed è molto più sicuro. risposta
0

Citando 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) 
2

del Kupa offre una grande soluzioni esplicativo e buona, se non si vuole o non sono in grado di seguire la soluzione di uno o due lì, ti suggerisco di verificare la soluzione 2 qui: http://dbtricks.com/?p=263.

Questo ha funzionato per me, creando una variabile e assegnandogli il valore della funzione locale, quindi utilizzando la variabile nell'istruzione sql che faceva riferimento alla tabella remota.

Spero che questo aiuti qualcuno come mi ha aiutato!

Problemi correlati