ORACLE勉強会資料 Vol.2


【目次】

1.データベース設計
1.1 ビュー
1.1.1 ビューの作成

1.1.2 ビューの確認・再作成

1.1.3 ビュー作成の注意

1.2 テーブル
1.2.1 データ型

1.2.2 デフォルト値と列制約

1.2.3 テーブル制約

1.2.4 表領域・記憶特性の指定

1.2.5 テーブル構成の変更

1.3 インデックスの作成
1.3.1 インデックスの作成指針
1.4 シーケンステーブル
1.4.1 シーケンステーブルの作成

1.4.2 シーケンステーブルの利用

1.5 シノニムの作成
1.5.1 プライベートシノニムとパブリックシノニム
1.6 オブジェクトの管理
 
 
TOPへ


【キーワード】

データベース設計とは・・・

DDLとは・・・

データベース管理とは・・・


TOPへ
 


1.データベース設計

データベースの設計は、表(テーブル)を作成するために必要となる要素を、システム対象業務などから抽出し、体系的に処理やデータの流れを図式化する作業である。
この作業のステップは、一般に「概念設計」、「論理設計」、「物理設計」の3つの工程に分けられ、各工程は下図のような関係になっている。
 
 
 
モデル 概念設計 概念ER図
概念ER図
処理要件
Oracle要件
論理設計 論理ER図(表・索引)
ビュー
制約条件
論理ER図
物理要件
性能要件
物理設計 DDL定義
初期物理配置
init.oraなどの決定

ここでは、データベース設計手法の詳細には立ち入らず、論理設計により得られた、ビュー・テーブル・制約などの記述方法、およびシーケンスやインデックスの作成についてのみ述べる。
 

TOPへ
 

1.1 ビュー

実際のテーブルは、アプリケーションから利用するには必ずしも良い構造とは言えない。また、アプリケーションごとで公開したり、非公開にしたりする項目が存在するかもしれない。
その場合、ビューを用いることで、複雑な問合せをあたかも一つのテーブルであるかのように見て、アプリケーション開発を効率化したり、データの機密性を高めたりできる。
 
 

1.1.1 ビューの作成

ビューの作成は、select文に対するview名の定義を行うことで作成される。
 
(基本形)
create or replace view ビュー名 as
  select カラムのリスト
    from テーブル(のリスト)
   where 条件;
(例)
SQL> create view V_PC管理マスター_202 as
2      select IPアドレス アドレス,利用者名 氏名
3        from PC管理マスター
4       where IPアドレス like '202%';


*参考*
ビューの内容によっては、更新・削除・挿入の処理が行えるが、以下のようなビューではそれらの操作は行えない。

基本的に、ビューに関しては、参照のみ行うことにし、更新・削除・挿入の処理については実表を対象にすること。
 

TOPへ
 

1.1.2 ビューの確認・再作成

ビューの構造を確認するときは、テーブルなどと同様、
SQL> desc ビュー名
と行う。

作成したビューのselect文の内容を確認するときは、USER_VIEWSを見る。

SQL> select view_name,text_length,text
2      from user_views
3     where view_name='ビュー名'


*参考*
where句で指定するビュー名は大文字になる。
textはlong型であり、表示上のDefault値は80になっている。そのため、通常表示しきれない分が切り落とされてしまうので、一度selectした後、

SQL> set long text_lengthの値
を行い、バッファの再実行'/'で検索し直す。
 

同じビュー名でビューを作り直すときは、

SQL> create or replace view ビュー名 as select 〜
と記述する。
 

TOPへ
 
 

1.1.3 ビュー作成の注意

ビューを作成する上では、以下のことに注意を払うべきである。 TOPへ
 
 

1.2 テーブル

テーブルとは、以前説明したように、テーブル名を持ち、カラムと行から構成される2次元構造のデータ集合である。
以下の操作により、テーブル名とカラム名、カラムの型を指定し、行が入るための「テーブル構造」が作成され、insert文などでデータを挿入することによって、テーブルは完成する。(狭義で「テーブルを作成する」と言うときは、テーブル構造を決定するところまでを言う)
 
(基本形)
create table テーブル名
( 項目名 データ型 [DEFAULT 式] [NOT NULL]
  [, ・・・]
  [, constraint テーブル制約]
  [, ・・・]
)
tablespace テーブルスペース名
storage ( 領域定義 );
TOPへ
 

1.2.1 データ型

それぞれの項目はデータ型を指定するが、主なものとして以下のようなものがある。
 
 
CHAR(n) 最大2000Byte(Oracle7では255Byte)までの固定長の文字列 組織コード、原価部門コード等の固定長の文字列に適している
FETCH時に、後続空白の区別をつけない
VARCHAR2(n) 最大4000Byte(Oracle7では2000Byte)までの可変長の文字列 組織名称、資材共通名称等の可変長で更新頻度の少ない文字列に適している
FETCH時に、後続空白によりデータが区別される
NUMBER(p,s) 最大38桁までの数値データ。精度pと位取りsで指定 整数や浮動小数等を含むあらゆる数字データを扱う
DATE BC 4712/1/1 〜 AD 4712/12/31の日時データ 日付や時間のデータを扱う (7Byteの大きさを持つ)
LONG
LONG RAW
最大2GByteまでの文字列
バイナリデータ
比較的長いデータ長を持つ文字列やバイナリ・データを扱う
LOB型
 CLOB
 BLOB
 BFILE

最大4GByteまでの可変長文字列
最大4GByteまでのバイナリ・データ
DB内にはファイルへのパス情報が格納される
Oracle8から導入された
比較的長いデータ長を持つ文字列、バイナリ・データを扱うデータ型
DBMS_?LOBで扱う?(要調査)

  *注意*
  LONG型およびLOB型の項目は、where句の条件に指定することはできない。
  LONG型はOracle8以降ではLOB型への移行を推奨されている。

TOPへ
 
 

1.2.2 デフォルト値と列制約

項目のデータ型につづけて、デフォルト値の指定と、NOTNULL制約などの項目ごとの制約を指定することもできる。

デフォルト値は、insert文などで、項目の値の指定を省略したときに取る値を指定するものである。
(ただし、defaultに指定できる式には若干の制限もある)
NOTNULL制約をつけると、その列の値としてNULL値を含むことができなくすることができる。
(列制約としてはNOTNULL制約の記述に限定する。それ以外の制約についてはテーブル制約で記述することとする)

(例)
create table PC管理マスター (
IPアドレス char(15)            not null,
利用者名     varchar2(20),
PC名       varchar2(20),
利用開始日   date      default sysdate not null
);

 

TOPへ
 
 

1.2.3 テーブル制約

テーブルを作成する際に、テーブル定義の一部として各種の整合性制約を指定することができます。
このような制約は、列の

2つ以上の列を参照する制約でなければ、これらの制約は列制約として記述することも可能であるが、テーブル制約で記述するように統一した方が判りやすい。
 

(例)
create table PC管理マスター (
IPアドレス char(15)                     not null,
利用者名     varchar2(20),
PC名       varchar2(20),
利用開始日   date         default sysdate not null,
constraint PK_PCMASTER primary key (IPアドレス)
  using index tablespace USER_IDX
              storage ( initial 10K next 10K pctincrease 0 )
);

create table WEB利用履歴 (
IPアドレス char(15),
URL         varchar2(200),
アクセス日時 date,
constraint FK_WEB_PC foreign key (IPアドレス)
                     refrences PC管理マスター(IPアドレス)
);
 


制約の種類には次のようなものがある。
 
PRIMARY KEY 列の組合せを表の主キーとして指定 USING INDEX句を指定すること
UNIQUE 列の組合せを一意キーとして指定 USING INDEX句を指定すること
FOREIGN KEY 列の組合せを他のテーブルとの参照制約の外部キーとして指定 FOREGIN KEY (columns) REFRENCES table (columns)
  ON DELETE CASCADE   ← CASCADE指定は必要があれば
CHECK 表の各行が満足しなければならない条件を指定 条件としてはwhere句で指定するような式を記述する

制約に絡むキーワードとして以下も参照
USING INDEX 主キーおよび一意キーの索引に対するパラメータの指定 インデックス名は制約名と同じになる
INDEXについては1.3を参照
ON DELETE CASCADE 参照表の行が削除されたときあわせて削除される 通常指定せずにアプリケーション側で対応するほうがよい

 

TOPへ
 
 
 

1.2.4 表領域・記憶特性の指定

テーブルを作成する際は、テーブルスペースの指定とstorage句によるパラメータの指定が必要である。(省略時はユーザー毎のデフォルト値が使用される)
ORACLEではテーブルを作成した時点で、指定したinitialエクステントの容量と、(minextents数-1)個のnextエクステント容量だけの容量がデータファイルに確保される。
(例)
create table PC管理マスター (
IPアドレス char(15)                     not null,
利用者名     varchar2(20),
PC名       varchar2(20),
利用開始日   date         default sysdate not null,
constraint PK_PCMASTER primary key (IPアドレス)
  using index tablespace USER_IDX
              storage ( initial 10K next 10K pctincrease 0 )
)
tablespace users
storage ( initial 1M next 100K pctincrease 0 )
;
*参考*
テーブル作成の際に指定できるパラメータにはtablespace句、storage句以外にも、PCTFREE、PCTUSED、INITRANSなど多数あるが、指定する必要はあまりないと思うので、ここでは割愛する。知りたい場合は、ORACLEマニュアル「SQL言語リファレンス」のcreate tableの項を参照。
テーブルスペースの指定については、インデックスとデータのテーブルスペースを分ける必要性(パフォーマンスに影響)などから、明示する癖をつけておいた方が良い。
 

storage句で指定するパラメータについては、以下のものがある。
 
 
INITIAL 第1エクステントのサイズを指定する KB、MB単位での指定も可能である。概算で容量を算定する必要がある
NEXT 第2エクステントのサイズを指定する INITIALの10%程度で作成するぐらいが良いと思われる
PCTINCREASE 第3エクステント以降のサイズの増分をパーセント指定する nextが100K、pctincreaseが50の場合、第3エクステントのサイズは150KBになる
MAXEXTENTS 割り当てることのできるエクステントの総数を指定する 指定しない(デフォルト値を使用)か、UNLIMITEDを指定する

概算容量の算出については、ORACLEマニュアル「管理者ガイド」の付録Aに「スキーマ・オブジェクトの領域の見積」として正確なやり方が載っている。
しかし、テーブルにnumberやvarchar2などの可変長のデータ型が含まれていて、それがどの程度の桁数の分布になるか想定できなかったり、行数自体の想定がざっくりとしたものであるので、以下の算出程度で作成しても良いのではないかと思う。

INITIAL            = 各列のバイト数の総和 × 推定行数
NEXT              = INITIAL × 0.1
PCTINCREASE = 0   (値に 0 を用いて、全て同じバイト数でエクステントを作成する方が、ブロックの再利用が行いやすくなるため)
 

TOPへ
 
 
 

1.2.5 テーブル構成の変更

テーブルに項目を追加したり、項目の型を変更する場合、また制約を追加する場合などには、ALTER TABLE文を使用する。
また、ALTER TABLE文ではstorage句の内容の変更も可能であるが、initial値の変更ができない、next値、pctincrease値の変更の反映は次のエクステントからなどの制限がある。

(基本形)
 
項目追加 alter table add (項目名 型 [デフォルト値] [ not null]);
制約の追加 alter table add (constraint 制約名 制約);
項目の型変更など alter table modify (項目名 型 [デフォルト値] [ not null]);
制約の削除 alter table drop constraint 制約名;

*参考*
項目の追加を行うと位置はかならず最後になってしまい、任意の位置に追加することはできない。また項目の削除も行うことはできない。 これらの作業を行いたい場合は以下の手順で行う。
 

といった作業で行う。ただし、元テーブルに対して、参照制約やビュー、トリガー、ファンクションなどが使用されていないことの確認、使用されている場合の復旧に注意をすること。
 
 

TOPへ
 
 

1.3 インデックス(索引)の作成

インデックスを作成する構文は以下である。
(基本形)
create index インデックス名
on テーブル名 ( 項目名 [ASC | DESC]
                [, ・・・] )
tablespace テーブルスペース名
storage ( 領域定義 ) ;

1.3.1 インデックスの作成指針

インデックスの作成を行わなくとも検索結果には影響は与えないが、インデックスは表から選択などの操作を行う際のパフォーマンスに大きく影響を与える。ORACLEは、選択の際にどのインデックスを用いるか、またインデックスを用いないで全件を対象にするかを自動的に判断して、最適の方法で実行するためである。また、使用するインデックスを指定して選択などの操作を行うことも可能である。
したがってアプリケーション開発者は、推定される選択の結合キー項目検索キー項目ソートキー項目にインデックスを定義する必要がある。

インデックスは、指定した列の組合せにたいしての順序をデータとしてDBに格納しておくものであるため、表にデータを挿入すると同時にインデックスもデータとして作成される(ただし元の表から行が削除されても領域は開放しない)。
表に対して大量のデータ挿入がある場合は、インデックスの挿入処理も発生するため、検索処理とのパフォーマンスのトレードオフについても考慮をしておく必要がある。
 

テーブル作成時においても、主キー制約およびユニークキー制約を宣言すると、指定をしていなくとも暗黙的にインデックスが作成される。そのときのインデックスのSTORAGE句とTABLESPACE句にはデフォルト値が使用されてしまうため、USING INDEX句を指定して明示的にパラメータを指定して作成する。
 
 

TOPへ
 
 

1.4 シーケンステーブル

シーケンステーブルは、複数のユーザー間でも一意の整数を取得する必要があるときに使用する。つまり、テーブルの主キーとして番号を使用する場合などの、ROLLBACKやCOMMITによらずに順序番号が増分されて、一意になる必要があるときに有効である。
 
 

1.4.1 シーケンステーブルの作成

シーケンステーブルは次の文で作成される。
(基本形)
create sequence シーケンス名
increment by 増分
maxvalue 最大値
minvelue 最小値
[start with 初期値]
[cycle];
increment by 増分の間隔を指定。0以外の28桁以内の整数。
MAXVALUEとMINVALUEの間の値でなければならない。
minvalue 順序の最小値を指定。
maxvalue 順序の最大値を指定。minvalue以上の値。
start with 最初に生成される順序の番号を指定。省略可。
省略時はincremenntの方向によってminvalueまたはmaxvalueが使用される。
cycle 指定があった時は、順序が最大値に達したときに、最小値から再度生成される。
指定がない場合は、最大値に達した以降は生成されない。

 

1.4.2 シーケンステーブルの利用

シーケンステーブルは、dual表を利用してNEXTVALを選択したときに、使用することのできる値を結果として返す。
NEXTVALを選択するたびに、新たな順序番号を自動的に生成する。一連の処理で順序を使用していて、最終的にROLLBACKされた場合でも、順序は元に戻さないため、その順序番号はスキップされることになる。
 
次に使える値 select シーケンス名.NEXTVAL from dual;
現在の値 select シーケンス名.CURRVAL from dual;
*注意*
currvalは前回nextvalで最後に参照した値を返すのでOracleを起動してから一度もnextvalを検索していないとエラーになる。
 
 

TOPへ
 
 

1.5 シノニム

シノニムとはテーブルやビューなどのオブジェクトに対してつける別名である。別の所有者のオブジェクトであったり、ネットワーク上の別のDBに存在するオブジェクトに対してシノニムを作成しておくことで、アプリケーション開発者は実際のオブジェクト名を知ることなく開発を行うことができる。つまり、実表を隠蔽するために使用したり、アプリケーションのメンテナンスを軽減するために有効である。
 
 

1.5.1 シノニムの作成

シノニムは次の文で作成することができる。
(基本形)
create [public] synonym シノニム名 for オブジェクト名;

1.5.1 プライベートシノニムとパブリックシノニム

シノニムを作成する際に、publicを指定して作成すると、そのシノニムはパブリックシノニムとなる。
パブリックシノニムは、PUBLICというユーザーグループのオブジェクトとして作成されるため、全ユーザーがアクセスが可能となる。ただし、その実オブジェクトに対してのアクセス権限を与えることも必要である。(権限については1.6.3 オブジェクトの権限を参照)
それに対し、プライベートシノニムはそのシノニムを作成したユーザーの中でのみ有効である。
パブリックシノニムとプライベートシノニムの両方が作成されている場合、プライベートシノニムが優先される。
 

TOPへ
 

1.6 オブジェクトの管理

いままで説明したオブジェクトの種別は以下に示すものである。
これらは、ORACLEが用意しているビューなどでその詳細を確認することができる。
 
table TABS、TABなど
tablespace USER_TABLESPACES
view USER_VIEWS
index USER_INDEXES
constraint USER_CONSTRAINTS
sequence USER_SEQUENCES
synonym USER_SYNONYMS
public synonym ALL_SYNONYMS
全オブジェクト USER_OBJECTS

 

1.6.1 オブジェクト名の変更

オブジェクト名の変更を行うには、以下の文で行う。
(基本形)
rename 元オブジェクト名 新オブジェクト名;

1.6.2 オブジェクトの削除

オブジェクトを削除するには、以下の文で行う。
(基本形)
drop オブジェクト種別 オブジェクト名;

1.6.3 オブジェクトの権限

作成したオブジェクトはとくに指定していなければ、そのユーザーのみが使用できる。他のユーザーにもそのオブジェクトを使用させたい場合は、権限を与えなければならない。権限に関する文は以下のものである。
 
(基本形)
grant オブジェクト権限 on オブジェクト名 to 授与ユーザー名;
オブジェクト権限には以下に示すものがある。
 
SELECT 問合せ 表・ビュー・順序
INSERT データ挿入 表・ビュー
UPDATE データ変更 表・ビュー
DELETE データ削除 表・ビュー
INDEX 索引の付加
ALTER 表定義の変更 表・順序
REFRENCES 参照制約の付加
EXECUTE 実行 プロシージャ・ファンクション・パッケージ(未出)

*注意*
権限を与えるときは、その影響に注意すること。信用できないユーザーに対して、ALTER権限を与えるなどしてはならない。
 

TOPへ