Come eseguire il debug di ORA-01775: catena di sinonimi?

Ho familiarità con il problema alla base di ORA-01775: la catena di sinonimi di looping, ma c’è qualche trucco per il debug di esso, o devo solo “creare o sostituire” la mia via d’uscita?

C’è un modo per interrogare lo schema o qualsiasi altra cosa per scoprire quale sia la definizione corrente di un sinonimo pubblico?

Ancora più fantastico sarebbe uno strumento grafico, ma a questo punto, qualsiasi cosa sarebbe utile.

A quanto pare, il problema non era in realtà una catena di sinonimi, ma il fatto che il sinonimo puntava a una vista che non esisteva.

Apparentemente, Oracle appare come una catena in loop in questa condizione.

Se utilizzi TOAD, vai a Visualizza> Opzioni rospo> Oracle> Generale e rimuovi TOAD_PLAN_TABLE dalla sezione ESPLINA PLAN e inserisci PLAN_TABLE

La tabella del dizionario dati DBA_SYNONYMS contiene informazioni su tutti i sinonimi in un database. Quindi puoi eseguire la query

 SELECT table_owner, table_name, db_link FROM dba_synonyms WHERE owner = 'PUBLIC' AND synonym_name = <> 

per vedere cosa indica attualmente il sinonimo pubblico.

La soluzione meno intuitiva a questo codice di errore sembra essere un problema con gli oggetti a cui punta il sinonimo.

Ecco il mio SQL per trovare sinonimi che puntano a oggetti errati.

 SELECT S.OWNER as SYN_OWNER, S.SYNONYM_NAME as SYN_NAME, S.TABLE_OWNER as OBJ_OWNER, S.TABLE_NAME as OBJ_NAME, CASE WHEN O.OWNER is null THEN 'MISSING' ELSE O.STATUS END as OBJ_STATUS FROM DBA_SYNONYMS S LEFT JOIN DBA_OBJECTS O ON S.TABLE_OWNER = O.OWNER AND S.TABLE_NAME = O.OBJECT_NAME WHERE O.OWNER is null OR O.STATUS != 'VALID'; 

Prova questa selezione per trovare i sinonimi problematici, elenca tutti i sinonimi che puntano a un object che non esiste (tabelle, viste, sequenze, pacchetti, procedure, funzioni)

 SELECT * FROM dba_synonyms WHERE table_owner = 'SYSADM' AND ( NOT EXISTS ( SELECT * FROM dba_tables WHERE dba_synonyms.table_name = dba_tables.TABLE_NAME ) AND NOT EXISTS ( SELECT * FROM dba_views WHERE dba_synonyms.table_name = dba_views.VIEW_NAME ) AND NOT EXISTS ( SELECT * FROM dba_sequences WHERE dba_synonyms.table_name = dba_sequences.sequence_NAME ) AND NOT EXISTS ( SELECT * FROM dba_dependencies WHERE type IN ( 'PACKAGE' ,'PROCEDURE' ,'FUNCTION' ) AND dba_synonyms.table_name = dba_dependencies.NAME ) ) 

Oggi ho ricevuto questo errore e, dopo il debug, ho scoperto che i tavoli effettivi stavano saltando, e mi riferivo ai sinonimi. Quindi suggerisco – prima controlla se i tavoli esistono !! :-))

Uno sviluppatore ha scritto accidentalmente un codice che ha generato ed eseguito la seguente istruzione SQL CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL"; che ha causato select * from dba_synonyms where table_name = 'DUAL'; per restituire PUBLIC DUAL SOME_USER DUAL piuttosto che PUBLIC DUAL SYS DUAL .

Siamo stati in grado di risolverlo (grazie a Come ricreare il sinonimo pubblico “DUAL”? ) Eseguendo

 ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=FALSE SCOPE=MEMORY; CREATE OR REPLACE PUBLIC SYNONYM DUAL FOR SYS.DUAL; ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=true SCOPE=MEMORY; 

Ho avuto un problema simile, che è risultato causato dalla mancanza di virgolette doppie dalla tabella e dal nome dello schema.

Abbiamo avuto lo stesso errore ORA-01775 ma nel nostro caso, l’utente dello schema mancava di alcuni “grant select” su un paio di sinonimi pubblici.

Passaggio 1) Scopri quali oggetti esistono con il nome:

 select * from all_objects where object_name = upper('&object_name'); 

Potrebbe esistere un sinonimo ma nessuna tabella?


Passaggio 2) Se questo non è il problema, indagare sul sinonimo:

 select * from all_synonyms where synonym_name = upper('&synonym_name'); 

Potrebbe essere che manchi una tabella o una vista sottostante a quel sinonimo?

ORA-01775: catena di sinonimi di looping ho affrontato l’errore di cui sopra mentre stavo cercando di compilare un pacchetto che utilizzava un object per il quale era stato creato il sinonimo, ma l’object sottostante non era disponibile.

Abbiamo riscontrato questo errore oggi. Questo è il modo in cui abbiamo eseguito il debug e risolto il problema.

  1. Il pacchetto è passato allo stato non valido a causa di questo errore ORA-01775 .

  2. Con il numero della riga di errore, siamo passati attraverso il codice del package e abbiamo trovato il codice che stava cercando di inserire i dati in una table .

  3. Abbiamo eseguito sotto le query per verificare se la table e il synonym sopra esistono.

     SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME'; -- No rows returned SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned 
  4. Con ciò abbiamo concluso che il tavolo deve essere ricreato. Come il synonym stava indicando una table che non esisteva.

  5. Il team di DBA ha ricreato la tabella e questo ha risolto il problema.

Sto usando il seguente sql per trovare le voci in tutti i sinonimi che non contengono oggetti corrispondenti per nome_object (in user_objects):

  select * from all_synonyms where table_owner = 'SCOTT' and synonym_name not like '%/%' and table_name not in ( select object_name from user_objects where object_type in ( 'TABLE', 'VIEW', 'PACKAGE', 'SEQUENCE', 'PROCEDURE', 'FUNCTION', 'TYPE' ) ); 

Mentre la risposta di Jarrod è una buona idea e rileva una più ampia gamma di problemi correlati, ho trovato questa query trovata nei forum Oracle per affrontare più direttamente il problema (originariamente dichiarato):

 select owner, synonym_name, connect_by_iscycle CYCLE from dba_synonyms where connect_by_iscycle > 0 connect by nocycle prior table_name = synonym_name and prior table_owner = owner union select 'PUBLIC', synonym_name, 1 from dba_synonyms where owner = 'PUBLIC' and table_name = synonym_name and (table_name, table_owner) not in (select object_name, owner from dba_objects where object_type != 'SYNONYM') 

https://community.oracle.com/message/4176300#4176300

Non dovrai guadare attraverso altri tipi di oggetti non validi. Solo quelli che sono effettivamente in loop senza fine.

http://ora-01775.ora-code.com/ suggerisce:

ORA-01775 : looping di sinonimi
Causa : attraverso una serie di dichiarazioni di sinonimi CREATE, è stato definito un sinonimo che si riferiva a se stesso. Ad esempio, le seguenti definizioni sono circolari:
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
Azione : modificare una definizione di sinonimo in modo che si applichi a una tabella di base o a una vista e riprovare l’operazione.

Se si sta compilando una PROCEDURA, è ansible che ciò si riferisca a una tabella o una vista che non esiste poiché viene creata nella stessa PROCEDURA. In questo caso la soluzione è rendere la query dichiarata come String eg v_query: = 'insert into table select * from table2 e quindi eseguire immediate su v_query ;

Questo perché il compilatore non riconosce ancora l’object e quindi non trova il riferimento. Saluti.

Avevo una funzione definita nello schema sbagliato e senza un sinonimo pubblico. Cioè il mio proc era nello schema “Cani” e la funzione era nello schema “Gatti”. La funzione non aveva un sinonimo pubblico per consentire ai cani di accedere alla funzione dei gatti.