web-dev-qa-db-ja.com

Oracleでスキーマ名を見つける方法読み取り専用ユーザーを使用してSQLセッションで接続している場合

私は読み取り専用ユーザーでOracleデータベースに接続しており、SQL Developerで接続を設定しているときにサービス名を使用したため、SID(スキーマ)がわかりません。

接続しているスキーマ名を見つけるにはどうすればよいですか?

ERダイアグラムを生成 にしたいので、これを探しています。そのプロセスでは、1つのステップでスキーマを選択するように求められます。ユーザー名を選択しようとすると、すべてのテーブルがスキーマユーザーにマップされていると推測されるため、任意のテーブルを取得します。

編集:コメントで提供された以下のSQL Frankによって部分的に答えを得ました、私の場合はスキーマである所有者名を与えました。しかし、すべての場合に適用できる一般的なソリューションであるかどうかはわかりません。

select owner, table_name from all_tables.

Edit:スキーマはすべてのdbオブジェクトの所有者であるため、上記のsqlはすべての場合に正しいソリューションだと思います。だから私はスキーマを取得するか、所有者の両方が同じです。以前、スキーマに関する私の理解は正しくなく、別の question を経験しましたが、見つかったスキーマもユーザーです。

フランク / a_horse_with_no_name これを答えに入れて、受け入れられるようにします。

19
Vipin

読み取り専用ユーザーを作成するには、アクセスするテーブルを所有しているユーザーとは異なるユーザーを設定する必要があります。

ユーザーを作成し、読み取り専用ユーザーにSELECT権限を付与するだけの場合、各テーブル名の前にスキーマ名を追加する必要があります。これを回避するには、基本的に2つのオプションがあります。

  1. セッションでcurrent schemaを設定します。
ALTER SESSION SET CURRENT_SCHEMA=XYZ
  1. すべてのテーブルの同義語を作成します。
CREATE SYNONYM READER_USER.TABLE1 FOR XYZ.TABLE1

したがって、所有者スキーマの名前を知らされていない場合、基本的に3つのオプションがあります。最後のものは常に動作するはずです:

  1. 現在のスキーマ設定を照会します。
SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL
  1. 同義語をリストします。
SELECT * FROM ALL_SYNONYMS WHERE OWNER = USER
  1. すべてのテーブルを調査します(いくつかの有名な標準スキーマを除く):
SELECT * FROM ALL_TABLES WHERE OWNER NOT IN ('SYS', 'SYSTEM', 'CTXSYS', 'MDSYS');
19
Codo

呼び出し SYS_CONTEXT は、現在のスキーマを取得します。 Tomに「現在のスキーマを取得する方法」を尋ねる

select sys_context( 'userenv', 'current_schema' ) from dual;
28