web-dev-qa-db-ja.com

ORA-01775のデバッグ方法:シノニムの連鎖ループ?

私はORA-01775の背後にある問題に精通しています:同義語のループをループしますが、それをデバッグするためのトリックがありますか、それとも「作成または置換」する必要がありますか?

スキーマを照会する方法や、パブリックシノニムの現在の定義を確認する方法はありますか?

さらに素晴らしいのはグラフィカルツールですが、この時点では何でも役に立ちます。

42
Josh Kodroff

結局のところ、問題は同義語のループチェーンではなく、同義語が存在しないビューを指しているという事実でした。

この状態では、Oracleはループチェーンとしてエラーが発生しているようです。

69
Josh Kodroff

TOADを使用している場合は、[表示]> [Toadオプション]> [Oracle]> [全般]に移動し、[EXPLAIN PLAN]セクションからTOAD_PLAN_TABLEを削除して、PLAN_TABLEを配置します。

27
LJT

データディクショナリテーブルDBA_SYNONYMSは、データベース内のすべての同義語に関する情報を持っています。クエリを実行できます

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

パブリックシノニムが現在指しているものを確認します。

22
Justin Cave

このエラーコードの直感的ではない解決策は、同義語が指しているオブジェクトの問題のようです。

これは、エラーのあるオブジェクトを指す同義語を見つけるための私の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';
15
Jarrod Chesney

この選択を試して問題のある同義語を見つけてください。存在しないオブジェクト(テーブル、ビュー、シーケンス、パッケージ、プロシージャ、関数)を指しているすべての同義語がリストされます。

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

今日、このエラーが発生しました。デバッグ後、実際のテーブルが欠落していることがわかりました。同義語を使用して参照していました。だから私は提案します-最初にテーブルが存在するかどうかを確認してください!! :-))

3
Alan

開発者が誤って次の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;
2
Tim Lewis

テーブルとスキーマ名の二重引用符が欠落していることが原因であることが判明した同様の問題がありました。

1
Jamie Kitson

同じORA-01775エラーが発生しましたが、この場合、スキーマユーザーはいくつかのパブリックシノニムで「許可選択」を失っていました。

1
Guy

手順1)名前が存在するオブジェクトを確認します。

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

シノニムは存在するが、テーブルは存在しない可能性がありますか?


ステップ2)それが問題でない場合、シノニムを調査します。

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

そのシノニムの基になるテーブルまたはビューが欠落している可能性がありますか?

1
grokster

今日、このエラーが発生しました。これがデバッグ方法と修正方法です。

  1. このエラーにより、パッケージは無効な状態になりましたORA-01775

  2. エラー行番号を使用して、package本体コードを調べ、tableにデータを挿入しようとしているコードを見つけました。

  3. 上記のtablesynonymが存在するかどうかを確認するクエリを実行しました。

    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チームがテーブルを再作成し、これにより問題が修正されました。

1
mahi_0707

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

他の種類の無効なオブジェクトを探す必要はありません。実際に無限ループにあるものだけ。

0
Justin

次の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'
         )
    );
0
wmorrison365

ORA-01775:シノニムのチェーンのループシノニムが作成されたオブジェクトを使用しているパッケージをコンパイルしようとして、上記のエラーが発生しましたが、基礎となるオブジェクトは使用できませんでした。

0
Nitin Guru