2016-07-29 10 views
0

2つのデータベース環境(従来のおよび既存のexadata)があるとします。レガシーかのExadataを:私は​​ユーザーだとの両方に対するSELECT権限を持っていることは、私は、私がアクセスしていますが、スキーマalter session set current_schema = A;現在のスキーマのセッションを変更します

を実行すると私の現在のセッションは、「PRODレガシー」

で同じスキーマ名A.に

を持つDB ?どうして?

はまた、私は私がalter session set current_schema = B;

を実行すると、なぜ私はAのスキーマの設定に基づいて、スキーマBにアクセスすることができる午前スキーマB.

へのアクセス権を持っています。

注:私は、データベースが複数のスキーマで構成されているSQL Developerの

+0

'alter session'は**別のデータベースへの接続を変更しません**。非修飾オブジェクトのデフォルトスキーマの変更のみです。それは決して別のデータベースに変更されません –

+0

ありがとう、私はoracleに新しいですので、より多くの説明が必要です。修飾されていないオブジェクトは何ですか?また、なぜ私はスキーマBのデータベースにアクセスすることができますが、全体的に異なる構成ですか? –

+0

'select * from tbl'は修飾されていません。 'select * from A.tbl'が修飾されています。後者は、テーブル名の前にスキーマ名を付けることに注意してください。'alter session set current_schema XX'コマンドを使用すると、オブジェクト名を修飾しないときにどのスキーマを使用するかをオラクルに伝えるだけです。したがって、 'select * from tbl'は、どのスキーマが*現在のスキーマとして設定されているかに応じて' A.tbl'または 'B.tbl'を問い合わせることができます。しかし、これはあなたが使用しているデータベースとは何の関係もありません。これは接続時に決定され、変更することはできません。 – sstan

答えて

0

を使用しています(ところで、オラクルでは、スキーマはかなりのユーザーと同じである)、および各スキーマは、異なるオブジェクトを含むことができ、そのよう

どのデータベースに接続するかは、データベースセッションの確立時に使用した接続文字列によって決まります。そのセッションの存続期間中は変更できません。

ABの2つのスキーマ(ユーザー)がデータベースにあり、どちらもtblという名前のテーブルがあるとします。あなたが照会するとき:

select * from tbl 

...これはどちらかというと質問していますか?それがcurrent_schemaの設定です。デフォルトでは、接続したユーザーのスキーマです。したがって、ユーザーAと接続した場合は、デフォルトでA.tblが照会されます。

あなたの代わりにユーザーAとして接続中B.tblを照会したい場合は、2つのオプションがあります:あなたのクエリを書くときは、常に明示的に必要なスキーマとテーブル名を修飾することができます

  1. を。例:select * from B.tbl コマンドを使用してデフォルトのスキーマをBに変更すると、select * from tblと言うと、自動的にselect * from B.tblに変換されます。

また、alter session set current_schemaコマンドを使用しても、そのスキーマのオブジェクトに対するアクセス許可が自動的に付与されるわけではありません。オブジェクト名を明示的に修飾しないと、照会の解釈が異なります。しかし、これらのオブジェクトを正常に照会するのに必要な権限が与えられている必要があります。

+0

素晴らしい答えです!!文章について少し混乱しました。「データベースに接続するデータベースは、データベースセッションを確立するときに使用した接続文字列によって決まり、接続はそのセッションの生涯にわたって変更されます。 sidなどを入れてsql開発者の接続を作成する、dbまたはスキーマに接続していますか?データベースとスキーマを交換可能に使用できますか?また、dba以外のユーザーのコマンドは、ユーザーがどのスキーマ? –

+0

いいえ、database!= schema。 'user/password @ sid'のような接続文字列を使って接続すると、' sid'で指定されたデータベースに接続していますが、特定のユーザを使ってそのデータベースにログインします。そのユーザーとしてログインすると、そのデータベースの一部であり権限を持っているスキーマのすべてのオブジェクトを照会できます。しかし、すべてのユーザーには、*所有する*デフォルトのスキーマがあります。 – sstan

+0

あなたの権限の質問に関しては、*スキーマ*ではなく*オブジェクト*ごとに権限が与えられます。したがって、スキーマ 'B'に1000個のテーブルがあり、ユーザー(スキーマ)' A'にアクセス権を与えたい場合、単にスキーマ 'B'へのアクセスを許可することはできません。私はすべての1000のテーブルへのアクセスを個別に許可する必要があります。その情報を取得するためのコマンドについては、私はオフハンドを覚えていません。あなたはそれを検索し、どこにでも回答が見つからない場合は新しい質問をしたいかもしれません。 – sstan

関連する問題