普通にDBに作成された表は、設計工程でデータベース設計に基づき
「正規化」された状態になっています。
正規化された表はユーザーから見ミると、常に使いやすいものではなく、
作成した表をそのままユーザーに使用させてしまうのもセキュリティ面でも
問題はあります。
そこで直接作成した表を使用シヨウさせないように、
フィルターのようなものであるビューを使用します。
ビューは実データを持たず、作成時に設定されたSELECT文を保持します。
ユーザーが作成されたビューを通して検索を行う場合、
表に対する操作と同じ方法で検索が行えます。
つまり、ユーザーから見ると、自分が表を操作しているのか、
ビューを操作しているのか、特に意識することなく作業が行えます。
例えば、従業員の仕事(job)、電話番号(phoneno)、お給料(comm)を一般ユーザーから
見られたくない時は…
empno | ename | job | hiredate | phoneno | comm | deptno |
---|---|---|---|---|---|---|
7369 | SMITH | CLERK | 90-04-01 | 03-xxx-xxxx | - | 20 |
7499 | ALLEN | SALESMAN | 85-04-01 | 047-xxx-xxxx | 300 | 30 |
7521 | WARD | SALESMAN | 98-11-01 | 06-xxx-xxxx | 500 | 30 |
検索結果を
(SELECT empno,ename,deptno FROM emp)
のSQL文で返ってきたものだけを使用します。
empno | ename | deptno |
---|---|---|
7369 | SMITH | 20 |
7499 | ALLEN | 30 |
7521 | WARD | 30 |
ビューを使用すると、まるで実際の表にはこのような列しかないように見えます。
例1:先ほどの「従業員の表」を例にすると…
それでは実際にビューの作成や削除を行う際に使用するSQL文について説明します。
ビューの作成は、CREATE VIEW文で行います。
CREATE VIEW文では、ビューの名前とSELECT文を指定します。
また、OR REPLACEを指定することで、すでに同じ名前のビューが作成されている場合、
そのビューの定義を上書きすることができます。
構文は以下のとおりです。
この例では、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) となります。
データベース内に作成されたビューを確認するには、
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 | タイプ付きビューのタイプ |
表をもとにしてビューを作成するときに、ビューの列に対して別名を付けることができます。
セキュリティの面から考えて、列に別名を付けることをお勧めします。
列に別名を付けるには、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;
この例は、さきほどの例と同じビューを、別の構文で作成しています。
ビューを通して表を操作する場合、検索だけでなくデータの挿入、更新、削除も行えます。
ただし、データの挿入、更新、削除を行う場合には、以下のような制限事項があります。
したがって、ビューで使用していない列にNOT NULL制約がある場合には、
データの挿入ができません。
ただし、その列に対してDEFAULTの指定がされている場合は除きます。
表A
empno ename job comm NOT NULL - - - ↓ビュー作成
※NOT NULL制約が掛かっているempnoがビューにない為、このビューにはデータの挿入は不可能。
表Aを元にしたビュー
ename job - -
(DEFAULTが指定されていればOK)
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文でWHERE句を使用しても、 ビューを通してのデータの挿入、更新、削除に関しては、 Where句で指定した条件が無視されてしまいます。
データの変更時にもWHERE句で指定した条件を利用したい場合には、
CREATE VIEW文の最後に
WITH CHECK OPTION
と付け加えてビューを作成してください。
ビューを削除するには、DROP VIEW文を使用します。
DROP VIEW文では、削除したいビューの名前を指定します。
構文は以下のとおりです。
例:
DROP VIEW employee_data4;
この例では、emp_salというビューを削除しています。
2001/03/02 担当:K.F