質問

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&quot; DUAL&quot; FOR&quot; DUAL&quot ;; が原因で select * from dba_synonyms where table_name = 'DUAL'; PUBLIC DUAL SYS DUAL ではなく、 PUBLIC DUAL SOME_USER DUAL を返します。

修正できました(パブリックシノニムを再作成する方法&quot; DUAL&quot ;?)を実行して

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');

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

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

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

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

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

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#4176300

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

http://ora-01775.ora-code.com/ の推奨事項:

ORA-01775 :同義語のループチェーン
原因:一連のCREATEシノニムステートメントを通じて、それ自体を参照するシノニムが定義されました。たとえば、次の定義は循環的です:
s2のSYNONYM s1の作成s3のSYNONYM s2の作成s1のSYNONYM s3の作成
アクション:シノニム定義を1つ変更して、ベーステーブルまたはビューに適用し、操作を再試行します。

PROCEDUREをコンパイルしている場合、これは、同じPROCEDUREで作成されたときに存在しないテーブルまたはビューを参照している可能性があります。この場合の解決策は、たとえば v_query:= 'table select * from table2 にStringとして宣言されたクエリを作成し、 v_query ;

で即時に実行することです。

これは、コンパイラがまだオブジェクトを認識していないため、参照が見つからないためです。ご挨拶。

間違ったスキーマで定義され、パブリックシノニムのない関数がありました。つまり私のプロシージャはスキーマ「犬」にありました;関数はスキーマ「Cats」にありました。この関数には、犬が猫の関数にアクセスできるようにするパブリックシノニムがありませんでした。

私にとって、テーブル名とシノニムは両方とも存在していましたが、所有者名が異なっていました。シノニムの所有者名と一致する所有者名でテーブルを再作成しました。

@ Mahi_0707が投稿したクエリを使用しました

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top