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.
El paquete pasó a estado no válido debido a este error
ORA-01775
.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 unatable
.Corrimos debajo de las consultas para verificar si existe la
table
y elsynonym
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
Con esto, llegamos a la conclusión de que la tabla debe ser recreada. Como el
synonym
apuntaba a unatable
que no existía.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.