Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Если вы используете TOAD, перейдите в меню "Вид" > "Параметры жабы" > "Oracle" > "Общие" и удалите TOAD_PLAN_TABLE из раздела PLAY_TABLE и поставьте PLAN_TABLE

Ответ 3

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

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

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

Ответ 4

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

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

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

SELECT *
FROM dba_synonyms
WHERE table_owner = 'SYSADM'
    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
            )
        )

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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


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

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

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

Ответ 11

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

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

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

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

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

Ответ 12

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

Ответ 13

Я использую следующий 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'
         )
    );

Ответ 14

Хотя ответ Джаррода является хорошей идеей и охватывает более широкий круг связанных проблем, я обнаружил, что этот запрос был найден на форумах 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

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

Ответ 15

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

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

Ответ 16

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

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

Ответ 17

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

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

Ответ 18

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