ORACLE MASTER資格の中級に位置付けられ、取得すればOracle技術者としてグローバルに認定される「ORACLE MASTER Silver Oracle Database 10g」。例題を利用してポイントを押さえ、確実な合格を目指そう!
本連載第6回「Oracleユーザーを作成してみよう」、第7回「権限とロールで効果的なユーザー管理を」で、ユーザーの管理方法を学びました。今回はスキーマオブジェクトの管理について紹介します。
Oracleユーザーが所有する表、索引、ビュー、順序の作成方法や管理内容を正しく理解しておく必要があります。表に関しては、特に制約による整合性チェックの動作などに注意しましょう。
PL/SQLによるプログラム構造体もオブジェクトですが、これらに関しては「PL/SQL」の回で解説します。
Oracleデータベースで使用することのできるオブジェクトは、何らかのOracleユーザーにより所有されています。個々のユーザーには独自の名前空間があり、この空間のことを「スキーマ」といいます。
同じスキーマ(名前空間)の中では同一のオブジェクト名を使用することができませんが、スキーマが異なれば同じオブジェクト名を持つこともできます。
オブジェクト名には、次のようなルールがあります。
長さの制限は変更できませんが、名前を「"」(ダブルクオーテーション)で囲んだ場合、そのほかのルールは適用されません。しかし使用するときは毎回「"」で囲む必要があり、大文字と小文字も区別されてしまうため、推奨されていません。
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データベースでは列に対し、次の制約を使用することができます。制約によって、格納データに特定のルールを適用できます。
参照キーを持つ親テーブル:外部キー列の値として使用されている場合、対象となる参照キー列値の変更とレコードの削除は禁止されます。ただし、FOREIGN KEY制約がON DELETE CASCADEで宣言されている場合、親テーブルのレコード削除と同時に子テーブルの依存レコードも削除されます。
外部キーを持つ子テーブル:親テーブルの参照キー列に含まれる値以外は、外部キー列値として使用できません。INSERT時、UPDATE時に、一致する値が存在するかどうかが確認されます。
遅延制約ではないPRIMARY KEY制約を定義することで自動的に設定されるものを2つ選択しなさい。
a.一意索引
b.一意ビットマップ索引
c.列に対するNOT NULL制約
d.列に対するCHECK制約
正解:a、c
前回、宿題とした問題です。遅延制約とは、トランザクションがCOMMITされるときにチェックされる制約の定義方法のことです。遅延制約を使っていない場合は、文が発行されるたびにチェックされます。
主キー制約(PRIMARY KEY制約)は、表の主キーを定義する制約です。主キーの特徴として、一意であること、値が必ず存在することの2つがあります。
主キー制約もしくは一意キー制約(UNIQUE KEY制約)を設定した場合、その列には索引が必要です。索引が存在しない場合、自動的に一意索引が作成されます。遅延制約の場合は、非一意索引が作成されます。
そのほかの選択肢の不正解の理由は次のとおりです。
●選択肢b:ビットマップ索引は、値の種類が少ない場合に有効な索引です。一意を保証するものではありません。
●選択肢d:CHECK制約は、その列値に条件を定義し、真(TRUE)であることを保証するための制約です。主キー制約の特徴を満たすためのルールを定義することはできません。
次の資料を確認してください。
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つの方法が考えられます。
そのほかの選択肢の不正解の理由は次のとおりです。
●選択肢a:CASCADEオプションという呼び方は不適切です。参照整合性制約で設定できるのはDELETE CASCADEのみです。UPDATE CASCADE(参照キーの変更を依存レコードにも反映させる)を行いたい場合は、データベーストリガーでプログラミングする必要があります。
●選択肢c:この方法で対応できなくはありませんが、EMP表そのものを削除する必要はなく、現実的な方法とはいえません。
索引が定義してある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.