ORA-01775: シノニムのループ チェーンの背後にある問題についてはよく知っていますが、それをデバッグするためのトリックはありますか、それとも「作成または置換」するだけで解決できますか?
パブリック シノニムの現在の定義が何であるかを調べるために、スキーマなどを照会する方法はありますか?
さらに素晴らしいのはグラフィカル ツールですが、この時点では何でも役に立ちます。
結局のところ、問題は実際にはシノニムのループ チェーンではなく、シノニムが存在しないビューを指していたという事実でした。
この状態では、Oracle は明らかにループ チェーンとしてエラーになります。
データ ディクショナリ テーブルDBA_SYNONYMS
には、データベース内のすべてのシノニムに関する情報が含まれています。したがって、クエリを実行できます
SELECT table_owner, table_name, db_link
FROM dba_synonyms
WHERE owner = 'PUBLIC'
AND synonym_name = <<synonym name>>
パブリック シノニムが現在何を指しているかを確認します。
この選択を試して、問題のあるシノニムを見つけてください。存在しないオブジェクト (テーブル、ビュー、シーケンス、パッケージ、プロシージャ、関数) を指しているすべてのシノニムが一覧表示されます。
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
)
)
今日、このエラーが発生しました。デバッグ後、シノニムを使用して参照していた実際のテーブルが欠落していることがわかりました。だから私は提案します-最初にテーブルが存在するかどうかを確認してください!! :-))
ステップ 1) 次の名前のオブジェクトが存在することを確認します。
select * from all_objects where object_name = upper('&object_name');
シノニムは存在するが、テーブルがない可能性がありますか?
ステップ 2) 問題がない場合は、シノニムを調べます。
select * from all_synonyms where synonym_name = upper('&synonym_name');
そのシノニムの基になるテーブルまたはビューが欠落している可能性がありますか?
同様の問題がありましたが、これは、テーブルとスキーマ名から二重引用符が欠落していることが原因であることが判明しました。
同じ ORA-01775 エラーが発生しましたが、私たちの場合、スキーマ ユーザーはいくつかのパブリック シノニムで「許可選択」を欠いていました。
ORA-01775: シノニムのループ・チェーン シノニムが作成されたオブジェクトを使用するパッケージをコンパイルしようとしたときに、上記のエラーが発生しましたが、基礎となるオブジェクトは使用できませんでした。
次の sql を使用して、object_name (user_objects 内) に対応するオブジェクトがない 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'
)
);
PROCEDURE をコンパイルしている場合、同じ PROCEDURE 内に作成されているため、存在しないテーブルまたはビューを参照している可能性があります。この場合の解決策は、たとえば String として宣言されたクエリを作成し、v_query: = 'insert into table select * from table2
すぐに実行することv_query
です。
これは、コンパイラがまだオブジェクトを認識していないため、参照が見つからないためです。ご挨拶。
http://ora-01775.ora-code.com/は次のことを示唆しています。
ORA-01775 : シノニムのチェーンをループしています
原因: 一連のCREATE synonym文により、それ自体を参照するシノニムが定義されました。たとえば、次の定義は循環的です。
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
アクション: 1 つのシノニム定義を変更して実表またはビューに適用し、操作を再試行してください。