Pregunta

Estoy familiarizado con el problema detrás de ORA-01775: cadena de sinónimos en bucle, pero ¿hay algún truco para depurarlo o simplemente tengo que " crear o reemplazar " mi manera de salir de esto?

¿Hay alguna forma de consultar el esquema o lo que sea para averiguar cuál es la definición actual de sinónimo público?

Aún más impresionante sería una herramienta gráfica, pero en este punto, cualquier cosa sería útil.

¿Fue útil?

Solución

Resulta que el problema no era en realidad una cadena de sinónimos en bucle, sino el hecho de que el sinónimo apuntaba a una vista que no existía.

Oracle aparentemente falla como una cadena de bucle en esta condición.

Otros consejos

Si está utilizando TOAD, vaya a Ver > Opciones de sapo > Oracle > General y elimine TOAD_PLAN_TABLE de la sección EXPLAIN PLAN y coloque PLAN_TABLE

La tabla de diccionario de datos DBA_SYNONYMS tiene información sobre todos los sinónimos en una base de datos. Para que puedas ejecutar la consulta

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

para ver lo que señala actualmente el sinónimo público.

La solución menos intuitiva de este código de error parece ser un problema con los objetos a los que apunta el sinónimo.

Aquí está mi SQL para encontrar sinónimos que apuntan a objetos erróneos.

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';

Intente esta selección para encontrar los sinónimos problemáticos, enumera todos los sinónimos que apuntan a un objeto que no existe (tablas, vistas, secuencias, paquetes, procedimientos, funciones)

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

Hoy recibí este error y, después de la depuración, descubrí que las tablas reales faltaban, a las que me refería con sinónimos. Así que sugiero - ¡¡primero verifique si las tablas existen !! :-))

Un desarrollador escribió accidentalmente un código que generó y ejecutó la siguiente declaración SQL CREAR O REEMPLAZAR EL SINÓNIMO PÚBLICO " DUAL " PARA " DUAL " ;; que provocó que seleccione * de dba_synonyms donde table_name = 'DUAL'; para devolver PUBLIC DUAL SOME_USER DUAL en lugar de PUBLIC DUAL SYS DUAL .

Pudimos arreglarlo (gracias a Cómo volver a crear un sinónimo público " DUAL " ;? ) ejecutando

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;

Tuve un problema similar, que resultó ser causado por la falta de comillas dobles en la tabla y el nombre del esquema.

Tuvimos el mismo error ORA-01775 pero en nuestro caso, al usuario del esquema le faltaba algo de 'concesión de selección' en un par de sinónimos públicos.

Paso 1) Mira qué objetos existen con el nombre:

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

¿Podría ser que exista un sinónimo pero no una tabla?


Paso 2) Si ese no es el problema, investiga el Sinónimo:

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

¿Podría ser que falte una tabla o vista subyacente a ese sinónimo?

Hemos encontrado este error hoy. Así es como lo hemos depurado y arreglado.

  1. El paquete pasó a un estado no válido debido a este error ORA-01775.

  2. Con el número de línea de error, revisamos el código del cuerpo package y encontramos el código que intentaba insertar datos en una tabla .

  3. Corrimos debajo de las consultas para verificar si existe la tabla y sinónimo anteriores.

    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 esto llegamos a la conclusión de que la tabla debe volver a crearse. Como el sinónimo apuntaba a una tabla que no existía.

  5. El equipo de DBA volvió a crear la tabla y esto solucionó el problema.

ORA-01775: cadena de sinónimos en bucle Enfrenté el error anterior mientras intentaba compilar un Paquete que estaba usando un objeto para el cual se creó un sinónimo, sin embargo, el objeto subyacente no estaba disponible.

Estoy usando el siguiente sql para buscar entradas en all_synonyms donde no hay un objeto correspondiente para el object_name (en 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'
         )
    );

Si bien la respuesta de Jarrod es una buena idea y detecta una gama más amplia de problemas relacionados, encontré esta consulta en los foros de Oracle para abordar de manera más directa el problema (declarado originalmente):

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

No tendrá que atravesar otros tipos de objetos no válidos. Solo aquellos que realmente están en bucles sin fin.

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

ORA-01775 : cadena de sinónimos en bucle
Causa : a través de una serie de declaraciones de sinónimo CREATE, se definió un sinónimo que se refería a sí mismo. Por ejemplo, las siguientes definiciones son circulares:
CREATE SYNONYM s1 para s2 CREATE SYNONYM s2 para s3 CREATE SYNONYM s3 para s1
Acción : cambie una definición de sinónimo para que se aplique a una tabla o vista base y vuelva a intentar la operación.

Si está compilando un PROCEDIMIENTO, posiblemente se esté refiriendo a una tabla o vista que no existe, ya que se creó en el mismo PROCEDIMIENTO. En este caso, la solución es hacer que la consulta se declare como String, por ejemplo, v_query: = 'insert in table select * from table2 y luego ejecútelo inmediatamente en v_query ;

Esto se debe a que el compilador aún no reconoce el objeto y, por lo tanto, no encuentra la referencia. Saludos.

Tenía una función definida en el esquema incorrecto y sin un sinónimo público. Es decir. mi proc estaba en el esquema " Perros " y la función estaba en el esquema "Gatos". La función no tenía un sinónimo público que permitiera a los perros acceder a la función de los gatos.

Para mí, el nombre de la tabla y el sinónimo existían, pero con nombres de propietarios diferentes. Volví a crear las tablas con el nombre del propietario que coincidía con el nombre del propietario en sinónimos.

Usé las consultas publicadas por @ Mahi_0707

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top