2008-10-29 5 views
39

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

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

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

ответ

62

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

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

+0

это странно - но приятно видеть, что вы нашли ошибку – warren 2008-10-29 17:37:55

+1

Ну, должно быть, что-то еще должно было произойти. Если я создаю представление, создайте синоним для него, а затем отбросьте представление, когда я попытаюсь запросить синоним, который я получаю: ORA-00980: синонимный перевод больше недействителен. – 2008-10-29 20:51:09

+2

Таблицы, из которых был выведен взгляд, - это все таблицы с общедоступными синонимами. Возможно, это имело какое-то отношение к этому. – 2009-05-20 15:20:42

21

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

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

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

+4

И имя синонима LIKE '% синонимное имя%' - немного более полезно. – 2009-09-02 22:20:19

+0

Если у вас нет доступа к dba_synonyms, вы можете попробовать тот же запрос для all_synonyms – 2016-02-05 03:35:29

-1

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

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

+0

-1 OP понимает, что такое цепочка циклов. Вопрос, который задает этот вопрос, - это метод определения того, какие синонимы нарушены. – 2016-06-02 23:18:57

+0

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

+0

OP запросил способ запросить схему для поиска недействительных синонимов или графического инструмента для поиска и исправления. Совет по его исправлению путем изменения определения синонимов не считается отладочной трюкой. Возраст этого, или мое отсутствие решения, не имеют никакого отношения к качеству этого. – 2016-06-02 23:30:17

1

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

3

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

0

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

1

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

23

Если вы используете ЖАБА, выберите Вид> жаба Функции> Oracle> Общие и удалить TOAD_PLAN_TABLE из EXPLAIN PLAN секции и положить PLAN_TABLE

1

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

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

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


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

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

Это может быть, что базовой таблицы или представления в этой Синоним не хватает?

4

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

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

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

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

5

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

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

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

Мы смогли это исправить (спасибо How to recreate public synonym "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; 
0

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

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

0

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

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

Смежные вопросы