synonyms ejemplo drop create sql oracle synonym

sql - ejemplo - grant synonym oracle



Cómo depurar ORA-01775: cadena de bucle de sinónimos? (17)

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

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

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


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


Hemos encontrado este error hoy. Así es como lo depuramos y lo solucionamos.

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

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

  3. Corrimos debajo de las consultas para verificar si existe la table y el synonym arriba.

    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 ser recreada. Como el synonym apuntaba a una table que no existía.

  5. El equipo de DBA recreó la tabla y esto solucionó el problema.


Hoy recibí este error, y después de la depuración me di cuenta de que las tablas reales estaban fallando, a lo que me refería usando sinónimos. Así que sugiero que compruebe primero si las tablas existen. :-))


La solución menos intuitiva a este código de error parece ser problemas 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'';


La tabla del diccionario de datos DBA_SYNONYMS tiene información sobre todos los sinónimos en una base de datos. Entonces puedes 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 el sinónimo público actualmente apunta.


ORA-01775: cadena de sinónimos de bucle. Me enfrenté al error anterior mientras intentaba compilar un paquete que usaba un objeto para el que se creó el sinónimo, pero el objeto subyacente no estaba disponible.


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

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

¿Podría ser que existe 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 faltara una Tabla o una Vista subyacente a ese Sinónimo?


Pruebe esta opción para buscar 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 = ''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 ) )


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

Oracle aparentemente se equivoca como una cadena de bucles en esta condición.


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

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ás que pasar por otros tipos de objetos no válidos. Solo aquellos que están realmente en bucles sin fin.


Si está compilando un PROCEDIMIENTO, posiblemente esto se refiere 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 into table select * from table2 y luego ejecutar immediate on v_query ;

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


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


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 para permitir a los perros acceder a la función de los gatos.


Tuve un problema similar, que resultó ser causado por la falta de comillas dobles fuera de 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 ''grant select'' en un par de sinónimos públicos.


Un desarrollador escribió accidentalmente el código que generó y ejecutó la siguiente instrucción SQL CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL"; que causó select * from dba_synonyms where table_name = ''DUAL''; para devolver PUBLIC DUAL SOME_USER DUAL lugar de PUBLIC DUAL SYS DUAL .

Pudimos arreglarlo (gracias a Cómo recrear el 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;


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

ORA-01775 : cadena de bucle de sinónimos
Causa : a través de una serie de declaraciones de sinónimos CREATE, se definió un sinónimo que se refería a sí mismo. Por ejemplo, las siguientes definiciones son circulares:
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for 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.