¿Cómo depurar ORA-01775: encadenamiento de sinónimos?
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.
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.
-
El paquete pasó a un estado no válido debido a este error
ORA-01775
. -
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 -
Corrimos debajo de las consultas para verificar si existe la
tabla
ysinó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
-
Con esto llegamos a la conclusión de que la tabla debe volver a crearse. Como el
sinónimo
apuntaba a unatabla
que no existía. -
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