8.1 スキーマオブジェクトの概要と表の管理

スキーマオブジェクトを管理する上で、必須との知識となるスキーマの概要と、数あるスキーマオブジェクトの中でも最も重要な表の管理方法について、解説します。

■スキーマとスキーマオブジェクト

Oracleデータベースにユーザアカウントを作成すると、ユーザのスキーマも同時に、同じ名前で作成されます。

スキーマは、表や索引などを作成したときの論理的なコンテナ(入れ物)と考えることができます。ユーザが作成した表や索引などのさまざまなオブジェクトは、スキーマという枠組みで管理されます。

スキーマは、Databaseのユーザによって、所有されます。

スキーマ名は、ユーザ名と同じ名前になります。

データベース内のオブジェクトは、いずれか1つのスキーマに属しており、そのスキーマ内に一意の名前を持っています。

これらのオブジェクトをスキーマオブジェクトと呼ぶ。

スキーマオブジェクトには、表、索引、ビューなどがあります。

例えば、JIROというユーザアカウントは、JIROというスキーマを所有しています。

JIROが作成した表、索引、ビューなどのスキーマオブジェクトは、JIROスキーマに属するオブジェクトとなります。

■データベース作成時に自動作成されるスキーマ

データベース作成時の処理で自動的に作成されるスキーマにSYS、SYSTEMの2つがあります。これらスキーマは、重要な役割を果たしています。

スキーマ名説明
SYSデータディクショナリを構成する全ての実表およびビューが作成されるスキーマ。SYSスキーマ内のオブジェクトは、データベースによって、内部的に使用されるため、SYSスキーマ内のオブジェクトを変更したり、オブジェクトを新規作成したりしてはいけなない。
SYSTEM管理情報を格納するための追加の表やビュー、および、Oracle製品のオプションやツールで使用される内部的な表やビューが作成されるスキーマ。
SYSTEMスキーマ内のオブジェクトは、データベースによって、内部的に使用されるため、SYSTEMスキーマ内のオブジェクトを変更したり、オブジェクトを新規作成したりしてはいけない。

事前構成済データベースを作成した場合は、サンプルスキーマを作成することも可能です。サンプルスキーマは、Oracle社が提供するドキュメントやカリキュラム内で使用されている例のために、共通の環境を提供することを目的として作成するキーマです。

HR(人事管理スキーマ)やOE(注文入力スキーマ)などがあります。

データベースには、スキーマオブジェクトではないオブジェクトも存在します。表領域、ユーザアカウント、プロファイル、ロールなどが該当します。

■スキーマオブジェクトへのアクセス

デフォルトでは、スキーマオブジェクトへのアクセスが許可されているのは、スキーマオブジェクトの所有者、または、高度なシステム権限を持つデータベース管理者だけです。

デフォルトでは、他のユーザは、自分以外のユーザが所有するスキーマオブジェクトにアクセスすることはできません。

スキーマオブジェクトへのアクセス権限を制御するのは、スキーマオブジェクトの所有者または、データベース管理者だけです。

他のユーザからもアクセスできるようにしたい場合は、そのユーザにオブジェクト権限を付与します。

■オブジェクトの命名規則

オブジェクトを作成する際に、各オブジェクト名をつける必要があります。オブジェクトの名前は、命名規則に従う必要があります。命名規則に反する名前はつけることができません。

・長さは30バイト以下(文字数ではなく、バイト数)

・先頭の文字は、数字以外の文字(数字および記号は不可)

・使用できる文字は、英数字(A~Z、a~z、0~9)および、漢字、カタカナ、ひらがな(日本語環境の場合に限る)

・使用できる記号は、アンダーバー_、ドル$、シャープ#の3種類のみ

・同一のスキーマ内で重複する名前は、指定できない

・OracleのSQL文に使用する予約語(SELECT、FROM、ORDERなど)は使用できない

・アルファベットの大文字・小文字は区別されない

■表の作成

表は、データベースにおけるデータ格納の基本単位です。最も重要なスキーマオブジェクトといえます。表には、ユーザが扱うすべてのデータが格納されます。

表には、列と行があり、各列に対して、データ型を指定する必要があります。また、列に対して、整合性制約を設定することで、列の入力値を制限することができます。

データ型固定長/可変長説明   
CHAR(n)固定長文字型長さがnバイトの固定長の文字データ。最大サイズは、2000バイト。デフォルト及び最小のサイズは、1バイト。
VARCHAR2(n)可変長文字型最大長がnバイトまたは、n文字の可変長文字データ。最大サイズは、4000バイト、最小サイズは、1バイトまたは、1文字。VARCHAR2では、最大長サイズを指定する必要がある。保存される文字列の実際の長さは、0にできるが、最大長は、1バイト以上にする必要がある。
DATE固定長日付型日付と時刻の情報を格納できるデータ型。世紀、年、月、日、時、分、秒まで格納することができる。有効範囲は、紀元前4712年1月1日~西暦9999年12月31日まで。
NUMBER(p,s)可変長数値型精度がp、位取りがsの数値データ型。精度は最大有効桁数、位取りは、小数点の右側の桁数。

■データの整合性

Oracleでは、表の1つ以上の列に整合性制約を定義できます。整合性制約とは、列に格納されるデータを制限するルールとなります。

整合性制約を正しく定義することで、表内のデータを常に正しい状態にすることができます。例えば、NULL値が入ってはいけない列がある場合、その列に対して、NOT NULL制約を定義します。定義することで、その列にNULL値が格納されることを防ぐことができます。

列にデータを挿入/更新する際に、ユーザが使用するアプリケーション側でチェックすることも可能だが、整合性制約を利用すれば、アプリケーション側に特別なコードを記載することなく、格納データの整合性を保つことができます。

制約SQL上での表記説明
NOT NULLNOT NULL値がNULLになることを禁止する。
一意キーUNIQUE複数の行で、同じ列または、列の組合せで、同じ値を持つことを禁止する。ただし、値がNULLになることは、許可される。1つの表に複数設定することができる。
主キーPRIMARY KEYNOT NULLT一意キーが組み合わされるのと同じ動作になる。主キー列の値は、重複することはなく、必ず値が存在しなければならない。主キー制約は、1つの表に最大1つ設定することができる。
複合主キー(複数の列の組合せで主キーとする)の場合は、主キー列の組合せで、複数の行の値が同じにならないように、また、各列の値が、NULLにならないようにする。
外部イーFOREIGN KEY複数の表を関連付けるための共通する列。表の各業について、外部キーの列の値が親キー(参照先の列)の値に一致することが要求される。参照整合性制約とも呼ぶ。
チェックCHECKデータベースの値が指定された条件を満たすようにする。例えば、給与の値は、10万以上、性別の値は、男女のどちらかにしたい場合などに用いる。

Oracleでは、列に対して、主キー制約や一意キー制約を作成すると、暗黙的に一位索引が生成される。

外部キー制約において、外部キー制約で参照する表を親表、参照先の列を親キー列と呼ぶ。また、外部キー制約が定義されている表を子表と呼ぶ。

外部キー制約は主キー制約、一意キー制約が定義されている列のみ参照できる。

■表の作成

表を作成すると、表の定義情報は、SYSTEM表領域にあるデータディクショナリに格納される。

表にデータを挿入すると表セグメントに対する1つ目のエクステントが、指定した表領域に割り当てられる。

■SQL Developerを使用した表の作成

SQL Developerを使用して表を作成するには、下記の手順を踏む。

[1]表を作成するユーザでSQL Developerに接続する。

[2]SQL Developerを移動して、接続を展開して、表ノードを右クリックして、新規の表を選択する。

[3]表の作成ウィンドウで各値を設定する。

名前フィールド:表明

列名フィールド:列名

タイプフィールド:データ型

サイズフィールド:適切な値

主キーの場合は、主キーチェックボックスをONにする。

NUMBER型の列の位取りを入力するには、右上の詳細チェックボックスをクリックする。

[4]列フィールドでスケール(位取り)を設定する列を選択して、スケールフィールドに値を入力する。画面から列を追加することも可能。

[5]表が作成されて表ノードにリストされる。編集ボタンを押せば、再度、表定義を編集できる。

■SQL文を使用した表の作成

SQL文を使用して、表を作成するには、CREATE TABLE文を用いる。表を作成するためには、CREATE TABLE権限、他のユーザが所有するスキーマに表を作成するためには、CREATE ANY TABLE権限が必要である。

CREATE TABLE AS SELECT文(CTAS)を使用すると、既存の表をもとにして新しい表を作成できる。表の作成と同時に副問合せで取り出したデータを表にコピーできる。

CREATE TABLE AS SELECT文(CTAS)では、NOT NULL制約以外の制約は、コピーされない。

▼表領域の割当制限

作成した表にデータを格納するには、表を作成するためのシステム権限(CREATE TALBE権限)、エクステントを獲得するための表領域の割当制限の療法が必要となる。

Oracle Database 11g R2以降では、表領域の割当制限がなくても、表を作成できるが、行を挿入しようとするとエラーと成り、行は挿入することはできない。

■Oracleデータベースでは、作成した表に対して、下記の変更作業を実行できる。

・表に新しい列を追加する。

・既存の列のデータ型を変更する。

・既存の列にデフォルト値を設定する。

・既存の列を削除する。

・既存の列の名前を変更する。

・表を読み取り/書込みモードにする。

・表を読み取り専用モードにする。

■SQL Developerを使用した表の変更

SQL Devloperで表を変更するには、下記の手順を踏む。

[1]変更する表を右クリックして、メニューを表示して、変更したいメニューを選択する。

■SQL文を使用した表の変更

SQL文を使用して既存の表を変更することもできる。

ALTER TABLE文を使用する。列および制約を追加するには、ALTER TABLE ~ ADD文を用いる。

制約は、列レベルまたは、表レベルで定義できる。列レベルで定義した制約を列レベル制約、表レベルで定義した制約を表レベル制約と呼ぶ。この2つの違いは、構文による違いだけである。

列のデータ型を変更するには、ALTER TABLE ~ MODIFY文を使用する。

NOT NULL制約以外の制約を追加するには、ALTER TABLE ~ ADD文を用いる。

■表の削除

表を削除すると、表内のすべてのデータ、表に定義されている制約、索引、データディクショナリに格納されている表の定義情報すべてが削除される。

一方で、表を参照するビューやシノニムは削除されず、無効となる。

表を削除できるのは、表の所有者または、DROP ANY TABLE権限を持つユーザのみです。削除した表は、デフォルトでは、ゴミ箱に入ります。

誤って削除したとしても、後でゴミ箱からリカバリできます。

表の削除により実行される処理は下記の通りです。

・表の定義がデータディクショナリから削除される。

・表のすべての行が削除される。

・表の定義されているすべての索引が削除される

・表を削除すると規定として、ゴミ箱に入る。(後からゴミ箱からのリカバリが可能)

ビューは、1つ以上の表または、他のビュー内のデータをカスタマイズして、表示するオブジェクトです。シノニムは、表やビューなどのスキーマオブジェクト名です。

■SQL Developerを使用した表の削除

SQL Developerを使用して表を削除することもできます。

[1]削除する表を右クリックして、表ー>削除をクリックする。

[2]削除ウィンドウで、必要に応じて削除オプションを選択して、適用ボタンをクリックする。

項目説明
カスケード制約チェックをつけると、参照整合性制約も同時に削除される。表内に別の列から参照される主キーがある場合は、この項目にチェックを付けないと表は削除できない。
パージ表を削除語、ゴミ箱に入れず、完全に削除する。

[3]表の削除が完了すると、確認メッセージが表示される。

■SQL文を使用した表の削除

SQL文を使用して、既存の表を削除するには、DROP TABLE文を使用する。

このとき、表をゴミ箱に入れないで、完全に削除する時は、PURGE句を指定する。

PURGE句を指定せずにDROP TABLE文を実行すると、表はゴミ箱に移動する。ゴミ箱に入れられた表は、フラッシュバック・ドロップ機能で復活させることができる。

あわせて読みたい