連載
» 2007年02月22日 00時00分 公開

ORACLE MASTER Silver DBA講座(8):Oracleデータベースのオブジェクトを管理する

ORACLE MASTER資格の中級に位置付けられ、取得すればOracle技術者としてグローバルに認定される「ORACLE MASTER Silver Oracle Database 10g」。例題を利用してポイントを押さえ、確実な合格を目指そう!

[有限会社 G.F.インフィニティ (Project - ∞)]

 本連載第6回「Oracleユーザーを作成してみよう」、第7回「権限とロールで効果的なユーザー管理を」で、ユーザーの管理方法を学びました。今回はスキーマオブジェクトの管理について紹介します。

スキーマオブジェクトの管理

ポイント

 Oracleユーザーが所有する表、索引、ビュー、順序の作成方法や管理内容を正しく理解しておく必要があります。表に関しては、特に制約による整合性チェックの動作などに注意しましょう。

 PL/SQLによるプログラム構造体もオブジェクトですが、これらに関しては「PL/SQL」の回で解説します。

スキーマオブジェクト

 Oracleデータベースで使用することのできるオブジェクトは、何らかのOracleユーザーにより所有されています。個々のユーザーには独自の名前空間があり、この空間のことを「スキーマ」といいます。

図1 ユーザーとスキーマ 図1 ユーザーとスキーマ

 同じスキーマ(名前空間)の中では同一のオブジェクト名を使用することができませんが、スキーマが異なれば同じオブジェクト名を持つこともできます。

 オブジェクト名には、次のようなルールがあります。

  • 名前の長さは1?30バイトです。ただし、データベース名は最大8バイト、データベースリンク名は最大128バイトという例外もあります。
  • Oracle予約語(TABLE、USERなど)は使用することができません。
  • 最初の文字として数字を使用することはできません。
  • 大文字と小文字は区別されません。

 長さの制限は変更できませんが、名前を「"」(ダブルクオーテーション)で囲んだ場合、そのほかのルールは適用されません。しかし使用するときは毎回「"」で囲む必要があり、大文字と小文字も区別されてしまうため、推奨されていません。

 SQL> CREATE TABLE "USER" (col1 NUMBER);
表が作成されました。
SQL> INSERT INTO USER VALUES(1);
INSERT INTO USER VALUES(1)
             *
行1でエラーが発生しました。:
ORA-00903: 表名が無効です。
SQL> INSERT INTO "USER" VALUES(1);
1行が作成されました。

制約

 Oracleデータベースでは列に対し、次の制約を使用することができます。制約によって、格納データに特定のルールを適用できます。

  • PRIMARY KEY
    レコードを一意に識別できることを保証します。特定の列、または列の組み合わせによって、テーブルに1つのみ宣言できます。PRIMARY KEYとして宣言された列または列の組み合わせには、重複しない値を格納することが必須です。また、索引が必要となっており、存在しなければ自動作成されます。
  • UNIQUE KEY
    PRIMARY KEY同様、レコードを一意に識別できることを保証します。ただしPRIMARY KEYと異なり、テーブルに複数宣言することができます。複数のレコードでNULL値が存在することも許可されています。なお、こちらも索引が必要です。
  • FOREIGN KEY
    複数のテーブル、または同一テーブル内の共通の列を使用して関連付けできることを保証します。各テーブルの共通列には同じ値が格納される必要があるため、次のルールが適用されます。

参照キーを持つ親テーブル:外部キー列の値として使用されている場合、対象となる参照キー列値の変更とレコードの削除は禁止されます。ただし、FOREIGN KEY制約がON DELETE CASCADEで宣言されている場合、親テーブルのレコード削除と同時に子テーブルの依存レコードも削除されます。

外部キーを持つ子テーブル:親テーブルの参照キー列に含まれる値以外は、外部キー列値として使用できません。INSERT時、UPDATE時に、一致する値が存在するかどうかが確認されます。

  • CHECK
    指定した条件に対して、真(TRUE)であることが保証されます。偽(FALSE)である場合、DML文はロールバックされます。
  • NOT NULL
    列値として必ず値が存在する(NULL値は存在しない)ことが保証されます。

問題

問題1

遅延制約ではないPRIMARY KEY制約を定義することで自動的に設定されるものを2つ選択しなさい。

a.一意索引
b.一意ビットマップ索引
c.列に対するNOT NULL制約
d.列に対するCHECK制約

正解:a、c

解説

 前回、宿題とした問題です。遅延制約とは、トランザクションがCOMMITされるときにチェックされる制約の定義方法のことです。遅延制約を使っていない場合は、文が発行されるたびにチェックされます。

 主キー制約(PRIMARY KEY制約)は、表の主キーを定義する制約です。主キーの特徴として、一意であること、値が必ず存在することの2つがあります。

 主キー制約もしくは一意キー制約(UNIQUE KEY制約)を設定した場合、その列には索引が必要です。索引が存在しない場合、自動的に一意索引が作成されます。遅延制約の場合は、非一意索引が作成されます。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢b:ビットマップ索引は、値の種類が少ない場合に有効な索引です。一意を保証するものではありません。

選択肢d:CHECK制約は、その列値に条件を定義し、真(TRUE)であることを保証するための制約です。主キー制約の特徴を満たすためのルールを定義することはできません。

問題2

次の資料を確認してください。

SQL> ALTER TABLE dept ADD CONSTRAINT dept_pk PRIMARY KEY(deptno);
SQL> ALTER TABLE emp ADD CONSTRAINT emp_fk
  2  FOREIGN KEY(deptno) REFERENCES dept(deptno);

次のコマンドを発行したところエラーとなりました。

SQL> DELETE FROM dept WHERE deptno=30;
ORA-02292: 整合性制約(SCOTT.FK_DEPTNO)に違反しました - 子レコードがあります

このエラーを回避する方法を2つ選択しなさい。

a.CASCADEオプションを使用するようにEMP表のDEPTNOの参照整合性制約を変更する
b.ON DELETE CASCADEオプションを使用するようにEMP表のDEPTNOの参照整合性制約を変更する
c.EMP表を削除してからDEPT表のDEPTNO=30のレコードを削除する
d.EMP表のDEPTNO=30のレコードを削除してからDEPT表のDEPTNO=30のレコードを削除する

正解:b、d

解説

 問題では、DEPT表に主キー制約を定義し、EMP表にDEPT表のDEPTNO列を参照する参照整合性制約を定義しています。

 外部キー制約により、EMP表のDEPTNO列では、DEPT表のDEPTNO列に存在する値のみを使用する必要があります。加えてDEPT表では、DELETEによるレコードの削除およびDEPTNO列値のUPDATEの際、EMP表のDEPTNO列に依存するレコードが存在しないかどうかのチェックが行われます。問題で取り上げられているのは、この依存レコードが存在したためにエラーが発生している状態です。

 エラーを回避するためには、2つの方法が考えられます。

  • 正解b:ON DELETE CASCADEオプションを使用して参照整合性制約を設定すると、親表からレコードを削除するとき、依存する子表のレコードも同時に削除されます。
  • 正解d:依存レコードが存在しなければこのエラーは発生しません。よって先に依存レコードである子表のレコードを削除し、その後、親表の対象レコードを削除します。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢a:CASCADEオプションという呼び方は不適切です。参照整合性制約で設定できるのはDELETE CASCADEのみです。UPDATE CASCADE(参照キーの変更を依存レコードにも反映させる)を行いたい場合は、データベーストリガーでプログラミングする必要があります。

選択肢c:この方法で対応できなくはありませんが、EMP表そのものを削除する必要はなく、現実的な方法とはいえません。

問題3

索引が定義してあるEMP表のENAME列の値を更新しました。索引の状態に関する説明として正しいものを選択しなさい。

a.リーフブロックの行が更新される
b.リーフブロックの行が削除され、挿入される
c.索引のすべての行が削除され、すべての行が再格納される
d.索引セグメントが別のセグメントとして再構築される

正解:b

解説

 索引内の索引エントリは、対応する表の列値を変更すると自動的に変更されます。この変更においては、索引エントリはソートされた状態で格納される必要があるため、エントリを削除して新しいエントリを追加するという方法が取られます(正解b)。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢a:表のレコードの場合、レコードの列値そのものが変更されますが、索引内ではソートされた状態を保つ必要があることから、これとは異なる方法が取られます。

選択肢c:1つ1つの変更のたびにこのような処理をしていたら、コストが高くなりすぎてしまいます。

選択肢d:索引セグメントを再構築するALTER INDEX 索引名 REBUILDコマンドの特徴です。

宿題

 次回は、「データの管理:SQL」を確認します。次の宿題を解いておいてください。

問題

scottとtomは、同じEMP表のデータを使用しています。scottがEMP表のSAL列の値を2倍に更新しました。しかし、tomがEMP表を検索しても更新前の値しか表示されません。この状態となる正しい理由を選択しなさい。

a.メモリキャッシュの破損のため
b.scottが更新をコミットしていないため
c.scottがセッションを終了していないため
d.インスタンスを再起動していないため

IT資格試験の模擬問題をWebベースで学習できる@IT自分戦略研究所の新サービス「@IT資格攻略」では、「Silver DBA(Oracle10g)」をはじめOracle関連の資格をテーマとして取り上げています。「無料お試し版」もありますので、記事と併せてご覧ください。



Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。