TOPスキーマ・オブジェクト >ビュー(VIEW)


ビュー(VIEW)


普通にDBに作成された表は、設計工程でデータベース設計に基づき
「正規化」された状態になっています。

正規化された表はユーザーから見ミると、常に使いやすいものではなく、
作成した表をそのままユーザーに使用させてしまうのもセキュリティ面でも
問題はあります。

そこで直接作成した表を使用シヨウさせないように、
フィルターのようなものであるビューを使用します。

ビューは実データを持たず、作成時に設定されたSELECT文を保持します。

ユーザーが作成されたビューを通して検索を行う場合、
表に対する操作と同じ方法で検索が行えます。
つまり、ユーザーから見ると、自分が表を操作しているのか、
ビューを操作しているのか、特に意識することなく作業が行えます。

ビューの利点

1.特定の列や行のみを見せるようなビューを作成し、関係のないデータや、
  アクセスされては困るデータを隠すことができます。

例えば、従業員の仕事(job)、電話番号(phoneno)、お給料(comm)を一般ユーザーから
見られたくない時は…

従業員の表(emp)

empno ename job hiredate phoneno comm deptno
7369SMITHCLERK90-04-0103-xxx-xxxx-20
7499ALLENSALESMAN85-04-01047-xxx-xxxx30030
7521WARDSALESMAN98-11-0106-xxx-xxxx50030

検索結果を
(SELECT empno,ename,deptno FROM emp)
のSQL文で返ってきたものだけを使用します。



ビューの表

empno ename deptno
7369SMITH20
7499ALLEN30
7521WARD30

ビューを使用すると、まるで実際の表にはこのような列しかないように見えます。

2.複雑な問合せを定義したビューを作成することで、ユーザーが複雑なSQL文を
  発行する必要がなくなります。したがって、ユーザーの要求するデータが変わっても、
  表やクライアントのアプリケーションを変更せずにビューの定義を変更するだけで
  対応できます。

例1:先ほどの「従業員の表」を例にすると…

従業員データ(emp表)と部署データ(dept表)は別々の表に格納されています。
従業員の情報とともに部署の情報も検索することが多いかもしれません。
ある従業員の部署番号だけでなく、
部署の名前や場所も一緒に知りたいような場合です。

通常は、

  SELECT ename,dname,loc FROM emp,dept
  WHERE emp.deptno = dept.deptno AND ename = 'SCOTT'

というSQL文になります。

このように2つの表を検索するSELECT文は少し複雑です。
よくある複雑なSELECTはビューの形にすれば、ユーザーが発行するSELECT文を
簡略化できます。

  SELECT ename,dname,loc FROM emp,dept WHERE emp.deptno = dept.deptno

というSELECT文でビューを作成しておきます。
ビューの名前をemp_deptとしておきます。すると通常流していたSQL文が

  SELECT ename,dname,loc FROM emp_dept WHERE ename = 'SCOTT'

と簡略化できるのです。

それでは実際にビューの作成や削除を行う際に使用するSQL文について説明します。

(1)ビューの作成

ビューの作成は、CREATE VIEW文で行います。

CREATE VIEW文では、ビューの名前とSELECT文を指定します。
また、OR REPLACEを指定することで、すでに同じ名前のビューが作成されている場合、
そのビューの定義を上書きすることができます。

構文は以下のとおりです。

CREATE (OR REPLASE) VIEW <作成するビューの名前> AS <SELECT文>;
例:
CREATE VIEW dept_emp
AS SELECT d.name, e.name, e.sal
  FROM department d, employee e
  WHERE d.id = e.dept_id;

この例では、department表とemployee表を結合した問合せをもとに、
dept_empというビューを作成しています。

例2:employeeとdepartmentから従業員番号と名前、入社日、部署
  情報を検索するビューemployee_data1を作成する場合は…

CREATE VIEW employee_data1 
    AS SELECT empno,ename,hiredate,dname
    FROM employee,department 
    WHERE employee.deptno = department.deptno;

    赤文字の部分は通常と同じSELECT文になります。

    作成した後にDESCRIBEコマンドで確認すると・・・

    SQL>DESC employee_data1

    名前              NULL?    タイプ
    ----------------- -------- -------------
    empno                      NUMBER(4)
    ename             NOT NULL VARCHAR2(10)
    hiredate                   DATE
    dname                      VARCHAR2(14)

    となります。

(2)ビューの確認

データベース内に作成されたビューを確認するには、
USER_VIEWSというデータ・ディクショナリを使用します。
USER_VIEWSは全ユーザーが使用できます。現在使用しているユーザーのビューの名前や、
ビューの使用しているSELECT文などが確認できます。

USER_VIEWSは、以下の列で構成されています。

SELECT * FROM USER_VIEWS;
のようにSQL文を流すと情報が出デてきます。

VIEW_NAMEビューの名前
TEXT_LENGTHビュー・テキストの長さ
TEXTビュー・テキスト
TYPE_TEXT_LENGTHタイプ付きビューのタイプ句の長さ
TYPE_TEXTタイプ付きビューのタイプ句
OID_TEXT_LENGTHタイプ付きビューのWITH OID句の長さ
OID_TEXTタイプ付きビューのWITH OID句
VIEW_TYPEタイプ付きビューのタイプ

(3)ビューの機能

表をもとにしてビューを作成するときに、ビューの列に対して別名を付けることができます。
セキュリティの面から考えて、列に別名を付けることをお勧めします。

列に別名を付けるには、CREATE VIEW文の中で指定することができます。

以下は、CREATE VIEW文の構文になります。

 CREATE [OR REPLACE]
 VIEW ビュー名 (ビューで使用する列名 [, ビューで使用する列名]...)
 AS SELECT文
 CREATE [OR REPLACE] VIEW ビュー名
 AS SELECT 列名 ビューで使用する列名 [,列名 ビューで使用する列名]......

例:
CREATE VIEW employee_data2 (eno,empname)
AS SELECT empno,ename FROM emp
  WHERE deptno = 10;

この例では、ビューの各列に対して、eno、empnameという列名を付けています。

例:
CREATE VIEW employee_data3
AS SELECT empno eno, ename empname FROM emp
  WHERE deptno = 10;

この例は、さきほどの例と同じビューを、別の構文で作成しています。

(4)ビューを通した表の更新

ビューを通して表を操作する場合、検索だけでなくデータの挿入、更新、削除も行えます。
ただし、データの挿入、更新、削除を行う場合には、以下のような制限事項があります。

制限事項

もとの表から列をいくつか選択してビューを定義している場合、ビューを通してデータを挿入すると ビューで使用していない列に対してはNULL値が入ります。

したがって、ビューで使用していない列にNOT NULL制約がある場合には、
データの挿入ができません。
ただし、その列に対してDEFAULTの指定がされている場合は除きます。

表A

empno ename job comm
NOT NULL---

  ↓ビュー作成

表Aを元にしたビュー

ename job
--
※NOT NULL制約が掛かっているempnoがビューにない為、このビューにはデータの挿入は不可能。
 (DEFAULTが指定されていればOK)

DISTINCT演算子、グループ関数、集合演算子、GROUP BY句、CONNECT BY句、 START WITH句を使用して、データを加工してビューを定義している場合、
そのビューを通してデータを挿入、更新、削除をすることはできません。

CREATE VIEW employee_data4
AS SELECT distinct(empno),ename,hiredate
FROM employee;

このSQLでビューを作成した場合は
DISTINCT句を使用しているため、挿入、更新、削除はできません。

INSERT INTO employee_data4
(empno,ename,hiredate)
VALUES (1000,'福島かおり',19990401);

を流してもエラーになります。

SELECT文において結合処理がされている場合、一意索引を持つ列が少なくとも1つはある場合、 ビューを通して1つの表を変更できます。

WITH CHECK OPTION付きでビューを作成した場合、 WHERE句で定義した条件に合わないデータは挿入できません。

ビューを作成するときに、SELECT文でWHERE句を使用しても、 ビューを通してのデータの挿入、更新、削除に関しては、 Where句で指定した条件が無視されてしまいます。

データの変更時にもWHERE句で指定した条件を利用したい場合には、 CREATE VIEW文の最後に
WITH CHECK OPTION
と付け加えてビューを作成してください。

(5)ビューの削除

ビューを削除するには、DROP VIEW文を使用します。

DROP VIEW文では、削除したいビューの名前を指定します。

構文は以下のとおりです。

DROP VIEW <削除するビューの名前>;

例:
DROP VIEW employee_data4;

この例では、emp_salというビューを削除しています。



TOPスキーマ・オブジェクト >ビュー(VIEW)

2001/03/02 担当:K.F