web-dev-qa-db-ja.com

パブリックシノニムを正しく作成する方法

これはかなりばかげていますが、助けが必要です。

Mydbownerが所有するテーブルがあります。 mydbowner.mytableという名前です。次のコマンドを発行して、パブリックシノニムを作成しようとしました。

CREATE OR REPLACE PUBLIC SYNONYM mytable FOR mydbowner.mytable;

これを行うと、次のようなテーブルにクエリを実行します。

ORA-01775:シノニムのループ・チェーン

このシノニムを問題なく作成するにはどうすればよいですか。

10
Joe

ジャスティンは正しい方向に進んでいると思います。実際には、mydbowner.mytableが存在しないということです。

次に例を示します。

SQL> conn mbobak
Enter password: 
Connected.
SQL> drop table mytable;
drop table mytable
           *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> create public synonym mytable for mbobak.mytable;

Synonym created.

SQL> select * from mytable;
select * from mytable
              *
ERROR at line 1:
ORA-01775: looping chain of synonyms

Oracleはmytableを解決しようとしていると思います。mbobakスキーマにはmytableがないため、PUBLICで検索して見つけ、mbobak.mytableを指していることがわかります。しかし、mbobak.mytableは存在しないため、PUBLICでmytableを検索し、ループがあります。

実際、mytableを作成すると、エラーは解消されます。

SQL> create table mytable as select * from dual;

Table created.

SQL> select * from mytable;

D
-
X

1 row selected.

SQL> drop table mytable;

Table dropped.

SQL> select * from mytable;
select * from mytable
              *
ERROR at line 1:
ORA-01775: looping chain of synonyms

はい、パブリックシノニムがmbobak.mytableに解決され、それが見つからない場合、エラーORA-942「テーブルまたはビューが存在しません。 「これは私にはずっと理にかなっています。

しかし、これはそれがどのように機能するかと思われます。

QED

お役に立てば幸いです。

14
Mark J. Bobak

あなたが得ているエラーは、mydbowner.mytableは実際にはテーブルではありません。なに

SELECT object_type
  FROM all_objects
 WHERE owner = 'MYDBOWNER'
   AND object_name = 'MYTABLE'

戻る?

7
Justin Cave