9章 ビュー(補足)

1.ビューとは?

検索の結果を、表のように見せかけるもの
(Accessのクエリー)

■ビューの使途

  1. 表に対して列レベルでセキュリティ設定する。
  2. 表や列に対して分かりやすいものにする。
  3. 頻繁に行われるような問い合わせを簡略化してデータベース・スキーマに格納しておく

使途1の説明

例えば社員表など、人によっては検索できるもの(社員名など)と検索させたくない(給与など)がある。
列を限定したビューを作成し、一般社員にはそのビューを公開して社員表自身は役職者のみに公開すれば、列レベルでセキュリティを設定できる。

使途2の説明

実際のシステムでは、表や列の名前に日本語はあまり使わない。しかし、英数字だけの名前ではユーザが表名や列名から内容を推測することは難しい。
英数字の名前を日本語に置き換えたビューを作成し、公開することにより、分かりやすい名前にする。

使途3の説明

例えば複雑な問い合わせを頻繁に行う場合、毎回そのSQL文を入力するのは効率が悪い。
よく使う問い合わせをビューとして作っておくことで、ユーザはそのビューを問い合わせるだけで同じ結果を得ることができる。

■POINT

2.ビューの作成

■構文

CREATE [OR REPLACE] VIEW ビュー名
 AS SELECT文;

例1)

emp表からempno, enameのみを取り出し、それぞれ社員番号、社員名と改名したビュー「社員表」を作成する

CREATE OR REPLACE VIEW 社員表
 AS SELECT empno "社員番号", ename "社員名" FROM emp;

例2)

例1と同じビューを別の手法で作成する

CREATE OR REPLACE VIEW 社員表("社員番号", "社員名")
 AS SELECT empno , ename FROM emp;

3.ビューの確認

■ビューを確認するデータ・ディクショナリ

データ・ディクショナリの列(抜粋)
列名内容
VIEW_NAMEビュー名
TEXTビューのSQL文

4.ビューの削除

■構文

DROP VIEW ビュー名;

5.ビュー(補足説明)

特に説明の必要なし

6.ビューを通したデータの更新

ビューは検索だけでなく、データの追加、更新、削除も行える

■注意点

■WITH CHECK OPTION

ビューを使って更新するデータを、ビューで表示可能なデータのみに制限する

1.OPTIONなし
CREATE VIEW view1 AS
 SELECT empno, ename, deptno FROM emp WHERE deptno = 10;

《ビューが作成される》
INSERT INTO view1 VALUES (1010, 'JONY', 20);
《view1を通してemp表にデータが追加される》 《view1をSELECTしても、追加したデータを見ることができない》
2.OPTIONあり
CREATE VIEW view1 AS
 SELECT empno, ename, deptno FROM emp WHERE deptno = 10
 WITH CHECK OPTION;

《ビューが作成される》
INSERT INTO view1 VALUES (1010, 'JONY', 20);
《deptnoが10でないため、エラーになる》

まとめ・補足

■ビューの利点

1.機密性
データを制限し、セキュリティを高める
2.簡便性
複雑なSQL文を保存する
3.整合性
WITH CHECK OPTIONによって、ビュー定義時の条件を常に保障する

■ビューの特徴

ビューは、問い合わせのたびに元の表にアクセスする。よって、元表のデータを変更したら、当然そのビューにも反映される。逆に、ビューに対してデータ操作(DML)を行うと、もと表のデータが変更される。ただし、ビューの定義によってはDMLによるデータの操作ができないものがある。

■WITH READ ONLYオプション

ビュー作成時にWITH READ ONLYオプションをつけることにより、そのビューを読み取り専用にすることができる。このオプションの付いたビューに対して一切のDML文を実行することはできない。

練習問題

問題1

次のSQL文で作成されたビューのうち、ビュー内の列に対してどんな更新も可能なものを選べ。

  1. CREATE VIEW emp_view AS SELECT DISTINCT job FROM emp;
  2. CREATE VIEW emp_view AS SELECT empno, ename, sal * 12 annsal FROM emp;
  3. CREATE VIEW emp_view AS SELECT deptno, AVG(sal) avgsal FROM emp FROUP BY deptno;
  4. CREATE VIEW emp_view AS SELECT * job FROM emp WITH READ ONLY;
  5. CREATE VIEW emp_view AS SELECT empno, ename, sal FROM emp;

問題2

以下のようにEMP表の作成およびビューの作成を行った。

CREATE TABLE emp (
 empno NUMBER(5) NOT NULL,
 ename VARCHAR2(20),
 job VARCHAR2(20),
 mgr NUMBER(5),
 hiredate DATE,
 sal NUMBER(7,2),
 comm NUMBER(7,2),  deptno NUMBER(4) NOT NULL);
CREATE VIEW v_emp1 AS
 SELECT job, AVG(sal) avg_sal FROM emp GROUP BY job;
CREATE VIEW v_emp2 AS
 SELECT empno, ename, job, mgr, sal, comm FROM emp;
CREATE VIEW v_emp3 AS
 SELECT empno, ename, job, mgr, sal, sal+comm salary FROM emp;

このビューを利用してEMP表に対して更新を行う。成功するSQL文を答えよ。

  1. UPDATE v_emp1 SET job = 'POST SALES' WHERE job = 'SALESMAN';
  2. UPDATE v_emp1 SET avg_sal = 1000 WHERE job = 'SALESMAN';
  3. INSERT INTO v_emp2 VALUES (1000, 'TOM', 'CLEAK', 7900, 1000, 500);
  4. UPDATE v_emp3 SET sal = 1000 WHERE empno = 7566;
  5. UPDATE v_emp3 SET sal = 1000 WHERE deptno = 30;
  6. DELETE FROM v_emp3 WHERE salary > 3000;

[ TOP ]