助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26755
問題を開く
オブジェクト名に関する説明として、正しいものはどれですか。
正解
オブジェクト名はスキーマ内で一意でなければならない
解説
オブジェクト名はスキーマ内で一意である必要があります。そのため、スキーマ内の表やビューに同じ名前を使用することはできません。ですが、異なるスキーマ同士では同じオブジェクト名を使用することができます。
※例外として、索引や制約などは種類の異なるオブジェクトであれば、スキーマ内で同じオブジェクト名を使用することが可能です(同一スキーマ内で表と索引に同じオブジェクト名を使用することができます)。
以上より、
・オブジェクト名はスキーマ内で一意でなければならない
が正解となります。
その他の選択肢については次のとおりです。
・スキーマ内で表とビューに同じ名前を使用することができる
同一スキーマ内で表とビューに同じ名前を使用することはできません。
・スキーマが異なっていても、同じオブジェクト名は使用できない
異なるスキーマ同士では同じオブジェクト名を使用することができます。
・表名と同じ列名は使用できない
列名はスキーマ・オブジェクトでは無い為、表名と同じ名前を使用することができます。
※例外として、索引や制約などは種類の異なるオブジェクトであれば、スキーマ内で同じオブジェクト名を使用することが可能です(同一スキーマ内で表と索引に同じオブジェクト名を使用することができます)。
以上より、
・オブジェクト名はスキーマ内で一意でなければならない
が正解となります。
その他の選択肢については次のとおりです。
・スキーマ内で表とビューに同じ名前を使用することができる
同一スキーマ内で表とビューに同じ名前を使用することはできません。
・スキーマが異なっていても、同じオブジェクト名は使用できない
異なるスキーマ同士では同じオブジェクト名を使用することができます。
・表名と同じ列名は使用できない
列名はスキーマ・オブジェクトでは無い為、表名と同じ名前を使用することができます。
参考
データベースに格納できる表やビューなどを総称してデータベース・オブジェクトと言います。データベース・オブジェクトは必ずいずれかのユーザーに所有されており、スキーマ・オブジェクトとも呼ばれます。
主なスキーマ・オブジェクトは以下のとおりです。

スキーマとは、オブジェクトの所有者を表す論理的な概念です。データベースのユーザーは必ず1つのスキーマを所有し(スキーマ名はユーザー名と同じ名前になります)、ユーザーが作成したオブジェクトは、そのユーザーが所有するスキーマに格納されます。
ユーザーは別のユーザーが所有しているオブジェクトを参照することもできますが、その場合は、
スキーマ名.オブジェクト名
のように、オブジェクト名の前にスキーマ名をつけて、どのスキーマのオブジェクトを参照するのかを指定しなければなりません。


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

なお、オブジェクト名は以下の命名規則に従う必要があります。
・オブジェクト名は30バイト以下(12c R2以降は128バイト以下)
・使用できる文字は、0~9,A~Z,a~z(日本語環境の場合は漢字,ひらがな,カタカナも使用可)
・使用できる記号は、_,$,#のみ
・オブジェクト名の先頭の文字は、数字,記号以外の文字
・Oracleの予約語は使用できない
この他、アルファベットの大文字と小文字は区別されません。
また、同一スキーマ内では重複するオブジェクト名は使用できません(異なるスキーマでは同じオブジェクト名を使用することができます)。
※例外として、索引や制約などは種類の異なるオブジェクトであれば、スキーマ内で同じオブジェクト名を使用することが可能です(同一スキーマ内で表と索引に同じオブジェクト名を使用することができます)。
大文字と小文字を区別したり、スペースを含めるなどネーミング規則に反する列別名を使用する場合は、オブジェクト名を 二重引用符(") で囲まなければなりません。


主なスキーマ・オブジェクトは以下のとおりです。

スキーマとは、オブジェクトの所有者を表す論理的な概念です。データベースのユーザーは必ず1つのスキーマを所有し(スキーマ名はユーザー名と同じ名前になります)、ユーザーが作成したオブジェクトは、そのユーザーが所有するスキーマに格納されます。
ユーザーは別のユーザーが所有しているオブジェクトを参照することもできますが、その場合は、
スキーマ名.オブジェクト名
のように、オブジェクト名の前にスキーマ名をつけて、どのスキーマのオブジェクトを参照するのかを指定しなければなりません。

SQLを表示
connect userA/oracle
SELECT object_name, object_type FROM user_objects;
SELECT object_name, object_type FROM user_objects;

SQLを表示
connect pingt/oracle
SELECT * FROM dummytable;
SELECT * FROM userA.dummytable;
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;
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;
CREATE VIEW departments
AS
SELECT * FROM employees;

SQLを表示
connect pingt/oracle
SELECT * FROM departments;
SELECT * FROM userA.departments;
SELECT * FROM departments;
SELECT * FROM userA.departments;
黒本ではスキーマ内でもオブジェクトの種類が違えば同じ名前は使えると記載されていたような、、、、
投稿日 2025/06/24
黒本では種類が違えばスキーマ内でも同じ名前を使えると記載されていたかなと思ってます。AIに聞いても使うソフト等によっては違うとは書いてあるものの、種類が違えば可能と記載されていたので、スキーマ内のオブジェクトの名前が一意でなければならないという表現はすこし違うのではないかなと思いました。
r
rink_rew
2025/06/24 19:15
そうですね。私も同じ認識で、索引や制約など種類が違えば同じ名称が使えると思います。
↓みたいな話ですよね。
SQL> CREATE TABLE test_obj (
2 id NUMBER PRIMARY KEY,
3 name VARCHAR2(50)
4 );
表が作成されました。
SQL> CREATE TABLE test_obj (
2 id NUMBER
3 );
CREATE TABLE test_obj (
*
行1でエラーが発生しました。:
ORA-00955: すでに使用されているオブジェクト名です。
-> 同じ名称の表は作成できない。
SQL> CREATE VIEW test_obj AS
2 SELECT * FROM dual;
SELECT * FROM dual
*
行2でエラーが発生しました。:
ORA-00955: すでに使用されているオブジェクト名です。
-> ビューもダメ
SQL> CREATE INDEX test_obj ON test_obj(name);
索引が作成されました。
SQL> SELECT OBJECT_NAME, OBJECT_TYPE
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME = 'TEST_OBJ';
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPE
-----------------------
TEST_OBJ
TABLE
TEST_OBJ
INDEX
SQL>
-> すでに存在する表「test_obj」と同じ名称の索引が作成できる
コメント
スタッフからの返信
この投稿に対して返信しませんか?
i inatu1227
2025/06/25 09:17
回答ありがとうございます!そうです!一概にもできないわけではないので、ビューと表は同じにはできないはわかるのですが、一意でなければならないわけではないと思ってもやもやしちゃってました。