Как отладить ORA-01775: циклическая цепочка синонимов?
Вопрос
Мне знакома проблема, связанная с 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