Domanda

Ho familiarità con il problema alla base di ORA-01775: ciclo continuo di sinonimi, ma c'è qualche trucco per eseguirne il debug, o devo solo "creare o sostituire"? la mia via d'uscita?

Esiste un modo per eseguire una query sullo schema o altro per scoprire qual è l'attuale definizione di sinonimo pubblico?

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

È stato utile?

Soluzione

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

Oracle apparentemente si presenta come una catena di loop in questa condizione.

Altri suggerimenti

Se stai usando TOAD, vai a Visualizza > Toad Options > Oracle > General e rimuovi TOAD_PLAN_TABLE dalla sezione EXPLAIN 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 = <<synonym name>>

per vedere a cosa punta 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 indicano 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 oggetto che non esiste (tabelle, viste, sequenze, pacchetti, procedure, funzioni)

SELECT *
FROM dba_synonyms
WHERE table_owner = 'USER'
    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 riscontrato questo errore e dopo il debug ho capito che mancavano le tabelle reali, a cui mi riferivo usando sinonimi. Quindi suggerisco di verificare prima che le tabelle esistano !! : -))

Uno sviluppatore ha accidentalmente scritto codice che ha generato ed eseguito la seguente istruzione SQL CREATE O REPLACE PUBNIC SYNONYM " DUAL " FOR " DUAL " ;; che ha causato select * da dba_synonies dove table_name = 'DUAL'; per restituire PUBLIC DUAL SOME_USER DUAL anziché 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 si è rivelato 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 un po 'di "selezione di concessione" 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 non è questo il problema, esaminare il Sinonimo:

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

È possibile che manchi una tabella o vista sottostante per quel sinonimo?

Oggi abbiamo riscontrato questo errore. 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, abbiamo esaminato il codice corpo pacchetto e abbiamo trovato il codice che stava cercando di inserire i dati in una tabella .

  3. Abbiamo eseguito le query seguenti per verificare l'esistenza della tabella e sinonimo sopra.

    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 questo abbiamo concluso che la tabella deve essere ricreata. Poiché il sinonimo puntava a una tabella che non esisteva.

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

ORA-01775: catena ciclica di sinonimi Ho riscontrato l'errore sopra riportato mentre cercavo di compilare un pacchetto che utilizzava un oggetto per il quale è stato creato un sinonimo ma l'oggetto sottostante non era disponibile.

Sto usando il seguente sql per trovare voci in all_synonym in cui non esiste un oggetto corrispondente per object_name (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 gamma più ampia di problemi correlati, ho trovato questa query trovata nei forum Oracle per affrontare più direttamente il problema (inizialmente indicato):

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 altri tipi di oggetti non validi. Solo quelli che sono effettivamente in loop infiniti.

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

ORA-01775 : ciclo continuo di sinonimi
Causa : attraverso una serie di dichiarazioni di sinonimi CREATE, è stato definito un sinonimo che faceva riferimento a se stesso. Ad esempio, le seguenti definizioni sono circolari:
CREATE SYNONYM s1 per s2 CREATE SYNONYM s2 per s3 CREATE SYNONYM s3 per s1
Azione : modifica una definizione di sinonimo in modo che si applichi a una tabella di base o visualizza e riprova l'operazione.

Se si sta compilando una PROCEDURA, probabilmente si tratta di una tabella o vista che non esiste poiché è stata creata nella stessa PROCEDURA. In questo caso, la soluzione è rendere la query dichiarata come String, ad es. v_query: = 'inserire nella tabella selezionare * dalla tabella2 e quindi eseguire immediatamente su v_query ;

Questo perché il compilatore non riconosce ancora l'oggetto 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.

Per me, il nome della tabella e il sinonimo esistevano entrambi ma con nomi di proprietari diversi. Ho ricreato le tabelle con il nome del proprietario che corrispondeva al nome del proprietario in sinonimi.

Ho usato le query postate da @ Mahi_0707

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top