Как отладить ORA-01775: циклическая цепочка синонимов? - PullRequest
42 голосов
/ 29 октября 2008

Я знаком с проблемой, стоящей за ORA-01775: циклическая цепочка синонимов, но есть ли хитрость для ее отладки, или мне просто нужно «создать или заменить» мой выход из этого?

Есть ли способ запросить схему или что-то еще, чтобы узнать, каково текущее определение общедоступного синонима?

Еще более удивительным был бы графический инструмент, но на этом этапе все было бы полезно.

Ответы [ 18 ]

66 голосов
/ 29 октября 2008

Как оказалось, проблема на самом деле была не в зацикливании цепочки синонимов, а в том, что синоним указывал на несуществующее представление.

Oracle, по-видимому, выдает ошибку в виде циклической цепочки в этом состоянии.

26 голосов
/ 19 апреля 2013

Если вы используете TOAD, перейдите в View> Options Toad> Oracle> General и удалите TOAD_PLAN_TABLE из раздела EXPLAIN PLAN и поместите PLAN_TABLE

22 голосов
/ 29 октября 2008

Таблица словаря данных DBA_SYNONYMS содержит информацию обо всех синонимах в базе данных. Таким образом, вы можете запустить запрос

SELECT table_owner, table_name, db_link
  FROM dba_synonyms 
 WHERE owner        = 'PUBLIC'
   AND synonym_name = <<synonym name>>

чтобы увидеть, на что в данный момент указывает общедоступный синоним.

15 голосов
/ 01 августа 2015

Менее интуитивно понятным решением этого кода ошибки являются проблемы с объектами, на которые указывает синоним.

Вот мой SQL для поиска синонимов, указывающих на ошибочные объекты.

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';
5 голосов
/ 09 октября 2014

Попробуйте этот вариант, чтобы найти проблемные синонимы, в нем перечислены все синонимы, которые указывают на несуществующий объект (таблицы, представления, последовательности, пакеты, процедуры, функции)

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
            )
        )
3 голосов
/ 18 февраля 2010

Сегодня я получил эту ошибку, и после отладки я выяснил, что действительные таблицы были ошибочными, о чем я говорил, используя синонимы. Поэтому я предлагаю - сначала проверьте, существуют ли таблицы! : -))

2 голосов
/ 24 августа 2015

Разработчик случайно написал код, который сгенерировал и запустил следующую инструкцию SQL CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL";, которая заставила select * from dba_synonyms where table_name = 'DUAL'; вернуть PUBLIC DUAL SOME_USER DUAL вместо PUBLIC DUAL SYS DUAL.

Мы смогли это исправить (благодаря Как воссоздать публичный синоним "DUAL"? ), запустив

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;
1 голос
/ 18 марта 2016

Мы столкнулись с этой ошибкой сегодня. Вот как мы отладили и исправили это.

  1. Пакет перешел в недопустимое состояние из-за этой ошибки ORA-01775.

  2. С номером строки ошибки мы прошли через код тела package и нашли код, который пытался вставить данные в table.

  3. Мы запустили следующие запросы, чтобы проверить, существуют ли указанные выше table и synonym.

    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. С этим мы пришли к выводу, что таблицу необходимо воссоздать. Поскольку synonym указывал на table, который не существовал.

  5. Команда DBA заново создала таблицу, и это решило проблему.

1 голос
/ 16 февраля 2010

У меня была похожая проблема, которая, как оказалось, была вызвана отсутствием двойных кавычек в таблице и имени схемы.

1 голос
/ 07 августа 2014

Шаг 1) Посмотрите, какие объекты существуют с именем:

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

Возможно, синоним существует, но таблицы нет?


Шаг 2) Если проблема не в этом, исследуйте синоним:

select * from all_synonyms where synonym_name = upper('&synonym_name');

Возможно, отсутствует базовая таблица или представление для этого синонима?

...