私はORA-01775の背後にある問題に精通しています:同義語のループをループしますが、それをデバッグするためのトリックがありますか、それとも「作成または置換」する必要がありますか?
スキーマを照会する方法や、パブリックシノニムの現在の定義を確認する方法はありますか?
さらに素晴らしいのはグラフィカルツールですが、この時点では何でも役に立ちます。
結局のところ、問題は同義語のループチェーンではなく、同義語が存在しないビューを指しているという事実でした。
この状態では、Oracleはループチェーンとしてエラーが発生しているようです。
TOADを使用している場合は、[表示]> [Toadオプション]> [Oracle]> [全般]に移動し、[EXPLAIN PLAN]セクションからTOAD_PLAN_TABLEを削除して、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 * 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;
テーブルとスキーマ名の二重引用符が欠落していることが原因であることが判明した同様の問題がありました。
同じ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
本体コードを調べ、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チームがテーブルを再作成し、これにより問題が修正されました。
Jarrodの答えは良いアイデアであり、関連する広範な問題をキャッチしますが、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#41763
他の種類の無効なオブジェクトを探す必要はありません。実際に無限ループにあるものだけ。
次のSQLを使用して、(user_objects内の)object_nameに対応するオブジェクトがないall_synonymsのエントリを見つけています。
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'
)
);
ORA-01775:シノニムのチェーンのループシノニムが作成されたオブジェクトを使用しているパッケージをコンパイルしようとして、上記のエラーが発生しましたが、基礎となるオブジェクトは使用できませんでした。