0

パブリック シノニムがある場合でも、独自のスキーマからのみデータを選択する方法はありますか?

何かのようなもの:Select * from current_schema.Table1

より詳しい情報:

schema1 の table1 でパブリック シノニムを取得しました。
今、table1 を選択するパッケージ (schema2 上) を持っています。schema1 ではなく schema2 の table1 を選択したいと思います。
私の問題は、ユーザーがサーバーでパッケージを使用するときに識別子を変更する必要がないことです。

編集
私の質問が明確ではありません。知りたいのは、現在のスキーマのプレースホルダーがあることです。

現時点では、これを行う必要があります: Select * from schema2.Table1

そして、私が欲しいのは、このようなものです: Select * from MySchema.Table1 または Select * from this.Table1 または Select * from current_schema.Table1

このようなものはオラクルに存在しますか?

4

1 に答える 1

1

スコープのルールは非常に明確です。データベースがクエリを解析するとき、次の優先順位でステートメント内の識別子に一致するオブジェクトを探します。

  1. スキーマ内のその名前のオブジェクト
  2. その名前のプライベート シノニム (スキーマ内)
  3. その名前の公的な同義語

ただし、明確にしたい場合は、テーブル参照の前に特定のスキーマ名を付けることができます。これは、コードを見ている他の人に意図を伝えるのに役立ちます。

さらに、スキーマにテーブル 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_USERSCHEMA1SCHEMA1SCHEMA1

詳細をご覧ください。

于 2012-08-08T09:24:59.823 に答える