Как отладить ORA-01775: циклическая цепочка синонимов?

StackOverflow https://stackoverflow.com/questions/247090

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

Вот мой 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';

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

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
            )
        )

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

Разработчик случайно написал код, который сгенерировал и выполнил следующий оператор SQL CREATE OR REPLACE PUBLIC SYNONYM " DUAL " FOR " DUAL " ;; , который вызвал select * из dba_synonyms, где 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;

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

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

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

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

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

<Ч>

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

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

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

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

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

  • Получив номер строки ошибки, мы прошли код тела package и нашли код, который пытался вставить данные в таблицу .

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

    SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME';  -- No rows returned
    
    SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned
    
  • С этим мы пришли к выводу, что таблицу необходимо воссоздать. Поскольку синоним указывал на таблицу , которой не было.

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

  • ORA-01775: циклическая цепочка синонимов Я столкнулся с вышеуказанной ошибкой, когда пытался скомпилировать пакет, в котором использовался объект, для которого был создан синоним, однако базовый объект был недоступен.

    Я использую следующий sql для поиска записей в all_synonyms, где нет соответствующего объекта для имени объекта (в 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'
             )
        );
    

    Хотя ответ Джаррода является хорошей идеей и охватывает более широкий круг связанных проблем, я нашел этот запрос на форумах Oracle для более непосредственного решения (первоначально заявленной) проблемы:

    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

    Вам не придется пробираться через другие виды недопустимых объектов. Только те, которые на самом деле в бесконечных циклах.

    http://ora-01775.ora-code.com/ предлагает:

    ORA-01775 : циклическая цепочка синонимов
    Причина . С помощью ряда операторов синонимов CREATE был определен синоним, который ссылался на себя. Например, следующие определения являются круглыми:
    CREATE SYNONYM s1 для s2 CREATE SYNONYM s2 для s3 CREATE SYNONYM s3 для s1
    Действие . Измените одно определение синонима, чтобы оно применялось к базовой таблице или представлению, и повторите операцию.

    Если вы компилируете ПРОЦЕДУРУ, возможно, это относится к таблице или представлению, которые не существуют, поскольку они созданы в той же ПРОЦЕДУРЕ. В этом случае решение состоит в том, чтобы сделать запрос, объявленный как String, например, v_query: = 'вставить в таблицу select * from table2 , а затем выполнить немедленно v_query ;

    Это потому, что компилятор еще не распознает объект и, следовательно, не находит ссылку. Привет.

    У меня была функция, определенная в неверной схеме и без открытого синонима. То есть мой процесс был в схеме "Собаки" и функция находилась в схеме "Cats". У функции не было общедоступного синонима, чтобы собаки могли получить доступ к функции кошек.

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

    Я использовал запросы, отправленные @ Mahi_0707

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top