スコープのルールは非常に明確です。データベースがクエリを解析するとき、次の優先順位でステートメント内の識別子に一致するオブジェクトを探します。
- スキーマ内のその名前のオブジェクト
- その名前のプライベート シノニム (スキーマ内)
- その名前の公的な同義語
ただし、明確にしたい場合は、テーブル参照の前に特定のスキーマ名を付けることができます。これは、コードを見ている他の人に意図を伝えるのに役立ちます。
さらに、スキーマにテーブル TABLE1 があり、クエリを実行する別のスキーマ内のテーブルを指す TABLE1 というパブリック シノニムがある場合は、代わりにその別のスキーマを参照にプレフィックスとして付ける必要があります。
「私が知りたかったのは、現在のスキーマのプレースホルダーがあるかということです」
いいえ、必要ないからです。デフォルトは常に現在のスキーマです。つまり、この声明...
SQL> select * from t23;
...その名前のテーブル (またはプライベート シノニム) がある場合、現在のスキーマの T23 から常に選択されます。
ALTER SESSION コマンドを使用して、現在のスキーマの値を変更できることに注意してください。
SQL> alter session set current_schema=scott;
ここで、前の選択を実行すると、SCOTT スキーマにそのようなテーブルがあり、そのテーブルに対する権限があれば、SCOTT.T23 から結果が返されます。Oracle スキーマの詳細については、私が以前に書いたブログ記事を参照してください。
私はあなたが抱えている問題を理解しようとしていました.あなたのシナリオは、あるユーザーが別のユーザーが所有するパッケージを実行していることに気付きました. 現在、デフォルトで、 が所有するパッケージは、が所有SCHEMA2
するオブジェクトに対して実行されSCHEMA2
、 に付与された他のオブジェクトに対する権限を使用しますSCHEMA2
。
しかし、PL/SQL はそれを変更する機能を提供します。AUTHID 句は、パッケージが定義者の権限 (パッケージ所有者) で実行されるか、実行者の権限 (現在のユーザー) で実行されるかを決定しSCHEMA2
ます。 TABLE2 の は、 のスコープ内のものになります。これは、によって所有されるか、パブリック シノニムによって示されるものになります。AUTHID CURRENT_USER
SCHEMA1
SCHEMA1
SCHEMA1
詳細をご覧ください。