助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26753
問題を開く
スキーマに関する説明として、正しいものはどれですか。

正解

他のユーザーが所有する表を参照するときには、スキーマ名を接頭辞として参照する

解説

表やビュー等のスキーマ・オブジェクトは必ずいずれかのユーザーに所有されています。スキーマとは、オブジェクトの所有者を表す論理的な概念です。

自分以外のユーザーが所有しているオブジェクトを参照する場合は、オブジェクト名に接頭辞としてスキーマ名をつけて「スキーマ名.オブジェクト名」のように参照しなければなりません。

以上より、
・他のユーザーが所有する表を参照するときには、スキーマ名を接頭辞として参照する
が正解となります。

その他の選択肢については次のとおりです。

・オブジェクトを格納する領域である
オブジェクトを格納する領域を記憶域といいます。記憶域はスキーマ・オブジェクトではありません。

・スキーマが異なっていても、同じ表名は使用できない
表名はスキーマ内で一意でなければなりませんが、異なるスキーマでは同じ表名を使用することができます。

・SELECT文で問合せを行う際に、スキーマを指定しない場合はSYSTEMユーザーの表を参照する
スキーマ名を指定しない場合は、ログインしているユーザーが所有している表を参照します。

参考

データベースに格納できる表やビューなどを総称してデータベース・オブジェクトと言います。データベース・オブジェクトは必ずいずれかのユーザーに所有されており、スキーマ・オブジェクトとも呼ばれます。
主なスキーマ・オブジェクトは以下のとおりです。



スキーマとは、オブジェクトの所有者を表す論理的な概念です。データベースのユーザーは必ず1つのスキーマを所有し(スキーマ名はユーザー名と同じ名前になります)、ユーザーが作成したオブジェクトは、そのユーザーが所有するスキーマに格納されます。

ユーザーは別のユーザーが所有しているオブジェクトを参照することもできますが、その場合は、

 スキーマ名.オブジェクト名

のように、オブジェクト名の前にスキーマ名をつけて、どのスキーマのオブジェクトを参照するのかを指定しなければなりません。


 

SQLを表示
connect userA/oracle

SELECT object_name, object_type FROM user_objects;



 
SQLを表示
connect pingt/oracle

SELECT * FROM dummytable;

SELECT * FROM userA.dummytable;


ただし、自分自身が有するオブジェクトを参照する場合には、スキーマ名を省略することができます。スキーマ名を省略した場合は、ログインしているユーザーのスキーマ内のオブジェクトを参照します。


 
SQLを表示
connect pingt/oracle

SELECT object_name, object_type FROM user_objects;

SELECT * FROM pingt.departments;

SELECT * FROM departments;


なお、オブジェクト名は以下の命名規則に従う必要があります。

・オブジェクト名は30バイト以下(12c R2以降は128バイト以下)
・使用できる文字は、0~9,A~Z,a~z(日本語環境の場合は漢字,ひらがな,カタカナも使用可)
・使用できる記号は、_,$,#のみ
・オブジェクト名の先頭の文字は、数字,記号以外の文字
・Oracleの予約語は使用できない

この他、アルファベットの大文字と小文字は区別されません。
また、同一スキーマ内では重複するオブジェクト名は使用できません(異なるスキーマでは同じオブジェクト名を使用することができます)。
大文字と小文字を区別したり、スペースを含めるなどネーミング規則に反する列別名を使用する場合は、オブジェクト名を 二重引用符(") で囲まなければなりません。


 
SQLを表示
SELECT * FROM departments;

CREATE VIEW departments
AS
SELECT * FROM employees;



 
SQLを表示
connect pingt/oracle

SELECT * FROM departments;

SELECT * FROM userA.departments;

上に戻る

スキーマと領域の違いについて

公開日 2023/11/21

CHATGPTに違いを問い合わせた結果、理解できたので共有します。

スキーマと表領域は、Oracleデータベースにおいて異なる概念です。

  • スキーマ:

定義: **スキーマは、データベース内のユーザーが所有するデータベースオブジェクトの集合を指します。**これにはテーブル、ビュー、シーケンス、インデックスなどが含まれます。
所有者: スキーマは通常、ユーザーに関連付けられており、ユーザーがデータベースオブジェクトを作成および管理できるようになります。
論理的な構造: スキーマは論理的な概念であり、物理的なデータの格納場所ではありません。ユーザーごとに異なるスキーマが存在し、各スキーマ内にデータベースオブジェクトが配置されます。

  • 表領域:

定義: 表領域はデータベースの物理的なデータの格納場所で、データベース内のテーブルやインデックスなどのオブジェクトがこれらの表領域に配置されます。
物理的な構造: 表領域は物理的なデータファイルに対応づけられており、これらのデータファイルがディスク上に存在します。
複数のスキーマのデータを格納: 一つの表領域内には、複数のユーザーのスキーマに属するデータが格納されることがあります。複数のスキーマが同じ表領域を使用することも可能です。
簡潔に言えば、スキーマは論理的なデータベースオブジェクトのまとまりであり、ユーザーによって所有されます。一方、表領域はこれらのオブジェクトを物理的に格納するための場所であり、複数のスキーマのデータが同じ表領域に格納されることがあります。

上記回答を踏まえて、私の認識を書きに記します。
領域は物理的なデータを格納する場所で、そこには様々なユーザの実際の表データが格納されている。
一方で、スキーマはユーザごとに論理的にデータを区別するための概念であり実際のデータは領域に格納されている。

もっとわかりやすい表現や、そもそもが認識違いであればコメントください。

2023/11/24 09:12

概ねご認識の通りだと思います。
ただ、物理的か論理的かという話で分けてしまうと、若干誤解があるかもしれません。

領域は物理的なデータを格納する場所で、そこには様々なユーザの実際の表データが格納されている。
一方で、スキーマはユーザごとに論理的にデータを区別するための概念であり実際のデータは領域に格納されている。

表領域は、一つ以上のデータファイルから構成される論理的な領域で、オブジェクトの格納先として指定する場所。(正確には、表や索引の物理的な格納場所はデータファイル)

  • データファイルの概念は、OSレベルで物理的
  • 表領域の概念は、Oracleレベルで論理的

私はこんな感じで理解しております。


コメント

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?