小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


SP2-0749: シノニム"xx"の循環パスを解決できません。

はじめに

Oracleで次のようなメッセージが出た場合、

SP2-0749: シノニム"xx"の循環パスを解決できません。

考えられる原因としては以下の2つがあります。

  • あるシノニムを指す、同じ名前のシノニムを作成した
  • シノニムをつけた先のテーブルが存在しないか、dropされている

即戦力のOracle管理術 ~仕組みからわかる効率的管理のノウハウ
内村 友亮 近藤 聖 近藤 良 武吉 佑祐 瀬沼 裕樹
技術評論社
売り上げランキング: 163,045

シノニムに対してシノニムを作成したケース

たとえば、以下のようなテーブルをcreateします。

create table table01
(
  id number,
  name varchar(50),
  furigana varchar(50),
  primary key( id )
);

これに対してシノニムを作成します。シノニムの作成はsysユーザで行います。

conn / as sysdba
CREATE OR REPLACE PUBLIC SYNONYM t1 FOR hoge.Table01;

t1に対して同じ名前でシノニムを作成してみます。

conn / as sysdba
CREATE OR REPLACE PUBLIC SYNONYM t1 FOR t1;

この状態でt1を参照すると、シノニムの指し先が自分自身を指す無限ループに陥るため、エラーとなります。

SQL> desc t1
SP2-0749: シノニム"t1"の循環パスを解決できません。

シノニムをつけた先のテーブルが存在しない

hogeユーザのテーブルtable01にt1という名前のシノニムを作成します。

CREATE OR REPLACE PUBLIC SYNONYM t1 FOR hoge.Table01;

テーブルをdropします。

drop table hoge.table01;

Oracle 10gの場合、この状態でテーブルを参照すると、SP2-0749のエラーになります。

SQL> desc t1
SP2-0749: シノニム"t1"の循環パスを解決できません。

ちょっとわかりにくいですね。素直にテーブルがないって言ってくれれば良いのに。

ちなみに

Oracle 11gの場合、シノニムの指し先がない場合は、テーブルが存在しないというメッセージが表示されます。

SQL> desc t1
ERROR:
ORA-04043: オブジェクト"HOGE"."TABLE01"は存在しません。