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

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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
52
0
304 209
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

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

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

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

И имя_синонима КАК "% имя синонима%" - немного полезнее.

Dave Jarvis 03.09.2009 02:20

Если у вас нет доступа к dba_synonyms, вы можете попробовать тот же запрос для all_synonyms

software.wikipedia 05.02.2016 06:35

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

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

-1 ОП понимает, что такое циклическая цепочка. Вопрос требует метода определения того, какие синонимы нарушены.

Kshitiz Sharma 03.06.2016 02:18

@KshitizSharma - видимо, вы не читали ни OP, ни мой ответ, цитату с Ora-code.com. «Действие» из цитаты должен был ответить на его вопрос. И поскольку никто за последние 8 лет не почувствовал необходимости сказать, что это было неправильно, ваш голос против не был особенно полезен. У тебя есть лучший ответ? Если нет, и учитывая этот вопрос и ответ почти десятилетней давности, я был бы признателен за отмену вашего голоса против.

warren 03.06.2016 02:22

OP попросил способ запросить схему для поиска недопустимых синонимов или графический инструмент для поиска и исправления. Совет исправить это самостоятельно, изменив определение синонима, не считается уловкой отладки. Возраст этого или отсутствие решения не имеют ничего общего с его качеством.

Kshitiz Sharma 03.06.2016 02:30
Ответ принят как подходящий

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

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

Что ж, должно быть происходило что-то большее. Если я создаю представление, создаю для него синоним, а затем отбрасываю представление, когда я пытаюсь запросить синоним, который я получаю: ORA-00980: перевод синонимов больше не действителен.

Dave Costa 29.10.2008 23:51

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

Josh Kodroff 20.05.2009 19:20

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

David Cramblett 09.05.2014 01:40

Я пытаюсь вставить во вновь созданную таблицу, и у меня такая же ошибка, не знаю почему :(

Mladen Oršolić 22.07.2015 10:15

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

DaaaahWhoosh 20.10.2015 19:56

Отсутствующий объект может создать цепочку в силу отсутствия

Andrew Brennan 22.09.2016 13:54

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

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

В моем случае «отсутствующая» таблица просто принадлежала другому пользователю БД. Всевозможные вариации на эту тему!

Jeff 16.11.2012 02:25

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

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

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

Спасибо. Это была моя проблема в Toad for Oracle.

joezen777 18.11.2013 20:15

А еще лучше использовать sys.plan_table$.

William Robertson 15.11.2017 21:08

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

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

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


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

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

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

не создавая таблицы, я создал общедоступный синоним, поскольку к этой таблице необходимо получить доступ из другой схемы, я выполнил грант, который не работал. я пробовал выбрать * из so_and_so_table; запрос вернул> "Цепочка синонимов ORA-01775". После создания таблицы эта проблема была исправлена.

Tim 07.09.2016 19:27

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

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

Это работает только для определенной схемы и для определенных типов объектов. Было бы лучше, если бы он ссылался на dba_objects.

Andrew Brennan 21.09.2016 18:50

Я бы рекомендовал изменить последнее условие на: AND NOT EXISTS ( SELECT * FROM all_objects WHERE object_type NOT IN ( 'SYNONYM' ) AND dba_synonyms.table_name = all_objects.OBJECT_NAME )

mxdsp 18.01.2019 13:54

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

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

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

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

Лучший ответ. Способ выяснить, что сломано.

Kshitiz Sharma 03.06.2016 02:21

@Jarrod Chesney, что делать с результатами этого запроса?

Daniel Belém Duarte 28.01.2017 21:56

@Daniel Belém Duarte воссоздает недостающий объект, а затем перекомпилирует. Работал у меня. Отличный код.

hslakhan 08.03.2018 19:48

Разработчик случайно написал код, который сгенерировал и выполнил следующий оператор 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.

Мы смогли исправить это (спасибо Как воссоздать публичный синоним «ДВОЙНОЙ»?), запустив

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. Пакет перешел в недопустимое состояние из-за этой ошибки 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 повторно создала таблицу, и это устранило проблему.

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

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

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

Я использовал запросы @ Mahi_0707

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