実行時にORA-00942(「テーブルまたはビューが存在しません」)が発生しました
select * from brunch
ただし、実行時にはそのような問題はありません
select * from joe.brunch
ここで何が問題なのか分かりますか?
修飾されていません。現在のセッションBRUNCH
とは異なるオブジェクトを参照しています。JOE.BRUNCH
それを修正するには、いくつかのオプションがあります。
パブリック シノニムを作成します。これにより、テーブルに対する権限を持つすべてのユーザーが、JOE.BRUNCH
クエリを実行してテーブルにアクセスできるようになります。BRUNCH
joe.brunch のパブリック シノニム ブランチを作成する
プライベート シノニムを作成します。これにより、現在のユーザーのみがJOE.BRUNCH
クエリによってテーブルにアクセスできるようになりますBRUNCH
joe.brunch の類義語ブランチを作成
現在のセッションの現在のスキーマを に変更しますJOE
。これにより、現在のセッションのすべての修飾されていない参照が、JOE
現在のユーザーのスキーマではなくスキーマに解決されます。
ALTER SESSION SET current_schema = JOE
いくつかの原因が考えられます
1)ブランチと呼ばれるオブジェクト(テーブル、ビュー、プロシージャなど)が複数あります。オラクルは、あなたがどちらを参照しているのかわかりません。
2) 最も可能性の高い原因: テーブルは joe スキーマに存在しますが、joe.brunch オブジェクトの選択を許可されていない別のユーザーとして接続しています。
試す
joe.brunch の select を your_user に付与します
これを試して、ブランチという名前に一致するオブジェクトの数を確認してください
select * from all_objects where object_type in ('TABLE','VIEW') and object_name = 'brunch';
私が参照していたテーブル (Flyway のschema_versionテーブル) が二重引用符で作成されていることがわかりました。
引用識別子は、二重引用符(")で始まり、二重引用符で終わります。引用識別子を使用してスキーマ・オブジェクトに名前を付ける場合、そのオブジェクトを参照するときは常に二重引用符を使用する必要があります。
実際には、これらは機能しました:
SELECT * FROM MYSCHEMA."schema_version";
SELECT * FROM "MYSCHEMA"."schema_version";
これがなかった場合 (-> ORA-00942: テーブルまたはビューが存在しません):
SELECT * FROM MYSCHEMA.schema_version;