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.

Foi ú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

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.

  1. O pacote foi ao estado inválido devido a este ORA-01775 erro.

  2. 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 uma table.

  3. Nós corremos abaixo consultas para verificar se o table e synonym 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
    
  4. Com isso, concluiu que as necessidades de tabela para ser re-criado. Como o synonym estava apontando para um table que não existia.

  5. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top