Oracleのスキーマとユーザーの違い
「スキーマ」と「ユーザー」の違い、わかりますか?
Oracleの初心者がつまづくものに「スキーマ」と「ユーザー」があります。
スキーマとユーザーの違い・・・わかりにくいですよね。
本を熟考しても、わかったようなわからないようなモヤモヤとした状態。何となくわかった気がするけれど人に説明できるかと言われれば説明できない感じ。
はっきりいってしまうと、スキーマ=ユーザーでいいのです。スキーマはユーザーでユーザーはスキーマと理解していても実務にほとんど影響はないはずです。安心しましたか?
とはいえ、正確に理解しておいて損はありません。せっかくなので、スキーマとユーザーについてのモヤモヤをなくし、白黒はっきりさせてしまいましょう。
スキーマとは?
ユーザーとスキーマの関係
まずは「ユーザー」。これはわかりますよね?Oracleに限らず、多くのアプリケーションでユーザーは使われています。
Windows起動時に最初に入力するログインユーザーなんて一般的ですよね?Oracleのユーザーも特段変わったことはなく、一般的なユーザーと同じです。
問題は「スキーマ」。これがやっかいです。わかりにくい。スキーマって何でしょうか?
「スキーマはテーブルなどのオブジェクトの集合体です」「スキーマの中にテーブルやビューが格納されます」と難しい本には書いてあります・・・が、よくわかりませんね。
スキーマはカバン(鞄)のこと
わかりやすくいうと、スキーマはテーブル・ビュー・索引を格納しておく入れ物、いわば「カバン」のようなものです。
ユーザーは人、スキーマはカバン、テーブル・ビューはノート・ペンと考えると位置関係がわかりやすいですね。
スキーマはカバンです。ユーザーの入れ物です。この位置関係を覚えて下さい。ココが重要です。
- 人・・・ユーザー
- カバン・・・スキーマ
- ペン・・・テーブル・ビュー
テーブルはペンのこと
では、「テーブルを作成する」とはどういうことでしょうか?人・カバン・ペンで言い換えてみましょう。
「テーブルを作成する」とは、「あなたがカバンの中にペンを入れる」ということです。「あなた(ユーザー)がカバン(スキーマ)の中にペン(テーブル)を入れる」。これがテーブルを作成するイメージです。
テーブルは何個でも作成できますが、スキーマの追加作成はできません。Oracleのルールでカバンは1人1つまで。ユーザーにスキーマは一つまでと決まっています。
ユーザー・スキーマ・テーブルの関係
ここまでをまとめます。
「ユーザーとスキーマ」は「人とカバン」の関係。「ユーザー」という人が「スキーマ」というカバンをもっていて、「スキーマ」というカバンの中に「テーブル・ビュー」というモノを沢山入れていくという仕組みです。
- 人・・・ユーザー
- カバン・・・スキーマ
- ペン・・・テーブル・ビュー
ユーザーとスキーマを作ってみる
スキーマを作る
「ユーザーとスキーマ」は「人とカバン」という関係性はわかりましたか?ではここでユーザーを作ってみましょう。
CREATE USER SATOU IDENTIFIED BY PASS;
このSQLでSATOUユーザーを作ることができます。ユーザーは作ることができましたが、ではスキーマはどのように作る?
スキーマは自動で作られる
実はこのSATOUユーザーが作られると、SATOUスキーマが自動的に作らるようになっています。ユーザーはSQLコマンドで作成しますが、スキーマはOracleにより自動生成されます。スキーマはユーザーと同じ名前(オブジェクト名)になるのでスキーマ名はSATOUです。
ちなみにSATOUユーザーを削除したらSATOUスキーマはどうなるでしょうか?
何となくおわかりかもしれませんが、SATOUスキーマも削除されます。ユーザーを作るとスキーマも勝手に作られ、ユーザーを消すとスキーマも勝手に消えます。ユーザーとスキーマの関係はわかりましたか?
スキーマとテーブルの関係
さらに突っ込んでみましょう!スキーマを理解するのにテーブルまで考えた方がわかりやすいので、スキーマとテーブルの関係について考えてみます。ではテーブルを作ってみましょう。
CREATE TABLE TBL1 (NOTE VARCHAR2(10)) TABLESPACE TABSP;
このSQLはTBL1テーブルというテーブルを作るSQLです。ではスキーマとの関係は?スキーマはでてきませんが、このCREATE文を実行したユーザーのスキーマにテーブルは作らます。
上記SQLを実行するにはOracleにログインしますよね?例えば、SATOUユーザーでログインして上記SQLを実行します。SATOUユーザーのスキーマはSATOUスキーマなので、SATOUスキーマにTBL1テーブルは作成されます。
ノートやペンを買うとカバンに入れるのと一緒です。テーブルやビュー(ノート・ペン)はスキーマに格納(カバンにいれる)されます。
ちなみにTBL1テーブルからみるとSATOUユーザーは持ち主になります。よって所有者と呼びます。SATOUユーザーという所有者がSATOUスキーマというカバンの中にTBL1テーブルというモノをいれました。ユーザーとスキーマとテーブルとの関係はわかりましたか?
SQL文でテーブル名の前に記述するのはスキーマ
では今度は別の角度から。SQLでデータ検索をして、具体的にスキーマとユーザーの関係を見ていきます。
SELECT * FROM SATOU.NOTE
TANAKAユーザーでログインしてこのSQLを実行したとします。FROM句の後は「スキーマ.テーブル」と記述します。SQLの基本ですがテーブル名の前にスキーマ(SATOU.)をつけるのがルールです。誰のカバンなのか明記しないと他人のカバンもあるので特定できなくなってしまいます。
ちなみにスキーマ名は自分のスキーマ(自分のカバン)であれば省略できるというルールがあります。SATOUユーザーが所有するNOTEテーブルを検索する場合は、スキーマは省略できますね。
SELECT * FROM NOTE
SATOUユーザの場合はこれでOKです。
間違えやすいユーザーとスキーマ
話を元に戻します。このSQLは「SATOUスキーマのNOTEテーブルを検索するSQL」という意味ですね。ここで記述した「SATOU.」はスキーマです。ユーザーではありませんよ!ユーザーは検索(SELECT)や登録(INSERT)などのSQL文には記述しません。
SQL文ではユーザーではなくスキーマを記述します。ここ間違えないで下さい。前述したとおり、ユーザーはスキーマと1対1なのでスキーマを記述すればどのユーザーの持ち物かがわかるのです。
でも、スタンダードに考えると、SATOU.NOTEのSATOUはユーザーと考えた方がしっくりきます。SATOUさんのNOTEテーブルですから。でも、このSATOUはユーザーではなくスキーマなんです。
「佐藤さんのノート」ではなく「佐藤さんのカバンに入っているノート」とSQLでは記述します。ここが混乱するポイントですね。この辺りがごっちゃになるとスキーマとユーザーの関係がわからなくなるのできちんと整理してください。
ここまででスキーマとユーザーの関係が理解できたでしょうか?
- ユーザーは人。
- スキーマはカバン。
- テーブルはペン。
- スキーマのなかにテーブルやビューをいれる。
- SQLではテーブルの前にスキーマをつける。
という事でした。
だから何?
ここでOracle初級者の方は感じませんか?「だから何?」「SQLの検索でスキーマを記述するといっても結局スキーマとユーザーは同じ名称だからユーザーを記述してもいいのでは?」
そうです。その通りなんです。結局は同じことです。
最初に説明したとおり、スキーマ=ユーザーでいいのです。前述のSQLをスキーマでなくユーザーと思って記述しても何の問題もありません。実務で支障がないといったのはこのためです。
ただ知っておいて欲しいのは、スキーマはユーザーのカバンに相当するもので、そのカバンの中にテーブルが入っているんだよという事です。
現場での小話
ここで一つ補足です。プロジェクトで仕事をしていると、人によって「ユーザー」と呼ぶ人と「スキーマ」と呼ぶ人がいます。これがまた混乱するポイントでもあります。
現場でありがちなのが、例えばNOTEテーブルがあって、
- 「NOTEテーブルのスキーマは何?」
- 「NOTEテーブルのユーザーは何?」
と聞かれることががあります。皆さん、この2つの質問をどう思いますか?
「NOTEテーブルのスキーマは何?」という質問はスキーマを聞いているので、格納先(カバン)を質問しています。対して、「NOTEテーブルのユーザーは何?」という質問は、ユーザーを聞いているので所有者(ヒト)を質問しています。
ただし、結局はユーザーとスキーマは同じ名前なのでどちらの質問も答えは同じになります。テーブルが入っているカバン(スキーマ)でも、テーブルを所有している人(ユーザー)でも、同じ名称であり、どちらでもテーブルを特定できるのでどちらの表現でも理解できるわけです。
現場で使うスキーマとユーザー、惑わされないようにしましょう。
スキーマとユーザーの違い、長々と説明しましたがわかりましたでしょうか?こうしてみると、そんな難しいことではありませんね。
コメント