Como depurar ORA-01775: loop cadeia de sinônimos?
Pergunta
Eu estou familiarizado com a questão por trás ORA-01775: loop cadeia de sinônimos, mas há qualquer truque para depurá-lo, ou eu só preciso "criar ou substituir" o meu caminho para sair dela?
Existe uma maneira de consultar o esquema ou qualquer outra coisa para descobrir o que a actual definição de sinônimo público é?
Ainda mais impressionante seria uma ferramenta gráfica, mas neste momento, qualquer coisa seria útil.
Solução
Como se vê, o problema não era na verdade uma cadeia de looping de sinônimos, mas o fato de que o sinônimo estava apontando para uma visão que não existia.
do Oracle aparentemente erros fora como uma cadeia looping nesta condição.
Outras dicas
Se você estiver usando sapo, vá em Exibir> Opções Sapo> A Oracle> Geral e remover TOAD_PLAN_TABLE de EXPLICAR seção de planejar e colocar PLAN_TABLE
O dicionário de dados tabela DBA_SYNONYMS
tem informações sobre todos os sinônimos em um banco de dados. Então você pode executar a consulta ??p>
SELECT table_owner, table_name, db_link
FROM dba_synonyms
WHERE owner = 'PUBLIC'
AND synonym_name = <<synonym name>>
para ver o que o sinônimo público atualmente aponta para.
A solução menos intuitiva para este código de erro parece haver problemas com os objetos que o sinônimo está apontando.
Aqui está o meu SQL para encontrar sinônimos que ponto 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';
Tente esta escolha para encontrar os sinônimos problemáticas, ele lista todos os sinônimos que estão apontando para um objeto que não existe (tabelas, vistas, sequências, pacotes, procedimentos, funções)
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
)
)
Hoje eu tenho esse erro, e após a depuração eu descobri que as tabelas reais foram misssing, que eu estava me referindo usando sinônimos. Por isso, sugiro - primeiro cheque que se as tabelas existe !! : -))
Um desenvolvedor acidentalmente escreveu o código que gerou e correu o seguinte CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL";
instrução SQL que causou select * from dba_synonyms where table_name = 'DUAL';
para PUBLIC DUAL SOME_USER DUAL
retorno ao invés de PUBLIC DUAL SYS DUAL
.
Nós fomos capazes de corrigi-lo (graças a Como recriar sinônimo público "DUAL" ? ) executando
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;
Eu tinha um problema semelhante, que acabou por ser causada por falta aspas fora do nome da tabela e esquema.
Nós tivemos o mesmo erro ORA-01775 mas no nosso caso, o usuário do esquema estava faltando alguns 'conceder selecione' em um par dos sinônimos públicos.
Passo 1) Veja o que objetos existem com o nome:
select * from all_objects where object_name = upper('&object_name');
Pode ser que um sinônimo existe, mas não Table?
Passo 2) Se isso não é o problema, investigar a Sinônimo:
select * from all_synonyms where synonym_name = upper('&synonym_name');
Pode ser que uma tabela subjacente ou Vista para que Sinônimo está faltando?
Encontramos esse erro hoje. Isto é como nós depurado e fixa-lo.
-
O pacote foi ao estado inválido devido a este
ORA-01775
erro. -
Com o número da linha de erro, Nós fomos através do código do corpo
package
e encontrou o código que estava tentando inserir dados em umatable
. -
Nós corremos abaixo consultas para verificar se o
table
esynonym
acima existe.SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME'; -- No rows returned SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned
-
Com isso, concluiu que as necessidades de tabela para ser re-criado. Como o
synonym
estava apontando para umtable
que não existia. -
equipe DBA re-criou a tabela e isso corrigiu o problema.
ORA-01775: loop cadeia de sinônimos Eu enfrentei o erro acima, enquanto eu estava tentando compilar um pacote que estava usando um objeto para o qual sinônimo foi criado no entanto subjacente objeto não estava disponível.
Eu estou usando o seguinte SQL para encontrar entradas no all_synonyms onde não há nenhum objeto correspondente para o object_name (em 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'
)
);
Enquanto a resposta de Jarrod é uma boa idéia, e pega uma ampla gama de problemas relacionados, achei que esta consulta encontrada em fóruns Oracle para abordar mais diretamente a questão (inicialmente previsto):
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
Você não terá que percorrer outros tipos de objetos inválidos. Apenas aqueles que estão realmente em loops infinitos.
http://ora-01775.ora-code.com/ sugere:
ORA-01775 : looping cadeia de sinônimos
Causa : Através de uma série de instruções CREATE sinônimo, um sinônimo foi definido que se refere a si mesmo. Por exemplo, as seguintes definições são circulares:
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
Action :. Alterar uma definição sinônimo de modo a que ela se aplica a uma tabela base ou vista e repita a operação
Se você está compilando um procedimento, possivelmente, está se referindo a uma tabela ou vista que não existe como ele é criado no mesmo procedimento. Neste caso, a solução é fazer a consulta declarada como corda por exemplo v_query: = 'insert into table select * from table2
e, em seguida, executar imediato sobre v_query
;
Isso ocorre porque o compilador ainda não reconhecer o objeto e, portanto, não encontrar a referência. Saudações.
Eu tinha uma função definida no esquema errado e sem um sinônimo público. Ou seja, meu proc estava no esquema "Dogs" ea função foi em esquema de "Gatos". A função não tinha um sinônimo público sobre ele para permitir cães para aceder à função dos gatos.
Para mim, o nome da tabela e o sinônimo tanto existia, mas sob diferentes nomes proprietários. Eu recriado as mesas sob o nome do proprietário que combinavam com o nome do proprietário em sinônimos.
Eu usei as consultas enviadas por @ Mahi_0707