はじめに
Oracle Database を学び始めた際に、多くの人が最初に混同するのが 「ユーザー」と「スキーマ」 です。
他のRDBMS(MySQL / PostgreSQL / SQL Server など)とは扱いが異なるため、書籍や公式ドキュメントを読んでも「結局どっちも同じでは?」とモヤモヤしがちなテーマです。
本記事では、両者の違いを 「人とカバン」のイメージで整理します。設計・運用の前提として、チーム内での共通認識づくりにご活用ください。
結論(1行でいうと)
- ユーザー = ログインするための「アカウント」
- スキーマ = そのユーザーが所有する「オブジェクトの集合」
Oracle では、ユーザーを作成すると同名のスキーマが自動的に作成される 仕様のため、実務上は「ユーザー ≒ スキーマ」として扱われる場面が多いものの、概念としては別物です。
それぞれの位置づけ
ユーザー(USER)
- データベースに接続するためのアカウント
- 認証(誰がアクセスしているか)と 認可(何が許可されているか)の主体
- 作成したオブジェクトの 所有者 となる
-
CREATE USERで作成し、DEFAULT TABLESPACE/TEMPORARY TABLESPACEを指定して領域を割り当てる
CREATE USER KATO IDENTIFIED BY "your_password"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
GRANT CREATE SESSION TO KATO;
💡 ポイント
DEFAULT TABLESPACEを省略するとデータベースのデフォルトの表領域に格納されます。運用環境では意図しない表領域にオブジェクトが作成されることを防ぐため、明示的に指定することが推奨されます。
スキーマ(SCHEMA)
- ユーザーが所有するデータベース・オブジェクトの集合体
- ユーザー作成と同時に、同名で自動生成される
- スキーマ名は 常にユーザー名と一致
- 名前空間 として機能し、別スキーマであれば同名テーブルの共存が可能
- ユーザー削除時には、所有するスキーマ内のオブジェクトもまとめて削除される
イメージで整理:人とカバンの関係
言葉だけだと分かりにくいので、よく使われる例えで整理します。
| 役割 | たとえ | Oracle 用語 |
|---|---|---|
| 人 | アカウント | ユーザー |
| カバン | 持ち物入れ | スキーマ |
| ノート・ペン | 中身 | テーブル・ビュー・索引 など |
- 人(ユーザー)は、生まれた時にカバン(スキーマ)を1つだけ与えられる
- カバンの中に、ノートやペン(テーブル等)を入れていく
- カバンを増やしたり、別の人と共有することはできない(1人 = 1カバン)
- カバンの中身の 持ち主(所有者)は常に1人 ですが、権限を付与すれば他のユーザーも中身を参照・操作できる
この 「ユーザーと同名のスキーマが自動で1つだけ作成される」 という性質がポイントです。
ユーザーとスキーマの違い
| 観点 | ユーザー | スキーマ |
|---|---|---|
| 性質 | ログイン用アカウント | オブジェクトの集合(名前空間) |
| 目的 | 認証・認可 | オブジェクトの所有・整理 |
| 作成方法 |
CREATE USER で明示的に作成 |
ユーザー作成時に自動生成 |
| 名前 | 任意 | ユーザー名と必ず同一 |
| 削除方法 |
DROP USER [CASCADE]で明示的に削除 |
ユーザー削除と同時に消える |
実際に確認してみる
DBA_USERS ビューを参照すると、ユーザー情報を確認できます。
-- ユーザー一覧
SELECT username, default_tablespace, temporary_tablespace
FROM dba_users;
作成したオブジェクトの所有者(=スキーマ)は DBA_OBJECTS で確認できます。
-- KATO スキーマが所有するオブジェクト一覧
SELECT owner, object_name, object_type
FROM dba_objects
WHERE owner = 'KATO';
別スキーマのオブジェクトへアクセスする際は、完全修飾名 を使います(要権限)。
-- 自分のスキーマのテーブルを参照
SELECT * FROM EMP;
-- 別スキーマ(SCOTT)のテーブルを参照
SELECT * FROM SCOTT.EMP;
紛らわしい点:CREATE SCHEMA の正体
Oracle には CREATE SCHEMA という構文がありますが、これは 新しいスキーマを作成するものではありません。
CREATE SCHEMAは、1トランザクション内で、複数のテーブル/ビューの作成と権限付与をまとめて行うための文
スキーマ自体は CREATE USER の時点で自動生成されているため、CREATE SCHEMA は 既存スキーマに対する一括DDL投入用 と覚えておくと混乱が減ります。
-- 例:hr スキーマにテーブル・ビュー・権限をまとめて定義
CREATE SCHEMA AUTHORIZATION hr
CREATE TABLE test1 (col1 VARCHAR2(10) PRIMARY KEY, col2 NUMBER)
CREATE VIEW test2 AS SELECT col1 FROM test1 WHERE col2 = 3
GRANT SELECT ON test2 TO other_user;
「ユーザー ≠ スキーマ」となる代表的なケース
通常は「ユーザー ≒ スキーマ」で支障ありませんが、両者が一致しない動作になる場面もあります。代表例は CURRENT_SCHEMA の切り替え です。
-- ログインは APP_USER のまま、参照先スキーマだけを切り替える
ALTER SESSION SET CURRENT_SCHEMA = OWNER_SCHEMA;
-- 以降、修飾なしのオブジェクトは OWNER_SCHEMA のものが解決される
SELECT * FROM CUSTOMERS; -- 実際は OWNER_SCHEMA.CUSTOMERS を参照
このケースでは以下のように動作します。
-
権限 は接続中のログインユーザー(
APP_USER) -
オブジェクトの解決先 は
CURRENT_SCHEMA(OWNER_SCHEMA)
オブジェクト所有ユーザー(スキーマオーナー) と、接続用ユーザー(アプリ用アカウント) を分離する設計などで利用されます。
まとめ
- ユーザー = アカウント(認証・認可の主体)
- スキーマ = そのユーザーが所有するオブジェクトの集合
- Oracle ではユーザー作成と同時に 同名スキーマが自動生成 される
- 実務的には「ユーザー ≒ スキーマ」で扱って問題ないが、
CURRENT_SCHEMA切り替え時など 両者が一致しないケース もあるため、概念としては区別しておくと安心 -
CREATE SCHEMAは新規スキーマ作成ではなく、複数DDLを1トランザクションでまとめる文
「人とカバンの関係」をイメージできれば、権限設計・オブジェクト参照・運用設計の理解がスムーズになります。
参考
📌 参考マニュアルのバージョンについて
本記事で紹介する参考リンクは、執筆時点で最新の Oracle AI Database 26ai(日本語版) を参照しています。
ご利用の環境が異なるバージョン(19c / 21c / 23ai など)の場合、機能や構文が一部異なる可能性があります。
該当バージョンのマニュアルは、以下のドキュメントポータルからご確認ください。
Oracle公式マニュアル(日本語版・26ai)
- Oracle AI Database 26ai SQL言語リファレンス|CREATE USER
https://docs.oracle.com/cd/G11854_01/sqlrf/CREATE-USER.html - Oracle AI Database 26ai SQL言語リファレンス|CREATE SCHEMA
https://docs.oracle.com/cd/G11854_01/sqlrf/CREATE-SCHEMA.html - Oracle AI Database 26ai SQL言語リファレンス 目次
https://docs.oracle.com/cd/G11854_01/sqlrf/index.html - Oracle AI Database 26ai ドキュメント・ポータル(日本語)
https://docs.oracle.com/cd/G47991_01/
BIPROGYグループの技術への取り組み
We Are Hiring!