検索の結果を、表のように見せかけるもの
(Accessのクエリー)■ビューの使途
- 表に対して列レベルでセキュリティ設定する。
- 表や列に対して分かりやすいものにする。
頻繁に行われるような問い合わせを簡略化してデータベース・スキーマに格納しておく使途1の説明
例えば社員表など、人によっては検索できるもの(社員名など)と検索させたくない(給与など)がある。
列を限定したビューを作成し、一般社員にはそのビューを公開して社員表自身は役職者のみに公開すれば、列レベルでセキュリティを設定できる。使途2の説明
実際のシステムでは、表や列の名前に日本語はあまり使わない。しかし、英数字だけの名前ではユーザが表名や列名から内容を推測することは難しい。
英数字の名前を日本語に置き換えたビューを作成し、公開することにより、分かりやすい名前にする。使途3の説明
例えば複雑な問い合わせを頻繁に行う場合、毎回そのSQL文を入力するのは効率が悪い。
よく使う問い合わせをビューとして作っておくことで、ユーザはそのビューを問い合わせるだけで同じ結果を得ることができる。■POINT
- ビューは定義(SQL文)だけがデータ・ディクショナリに格納される
実際のデータは検索時に表から読み込まれる
■構文
CREATE [OR REPLACE] VIEW ビュー名
AS SELECT文;
- CREATE VIEW文では、指定したビュー名が同一スキーマに存在しているとエラーになる
- CREATE OR REPLACE文では、同一スキーマ内にビューが存在していれば上書きを、なければ新規作成する
(REPLACE VIEW文は存在しない!!)例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;
■ビューを確認するデータ・ディクショナリ
- USER_VIEWS
- ALL_VIEWS
- DBA_VIEWS
データ・ディクショナリの列(抜粋) 列名 内容 VIEW_NAME ビュー名 TEXT ビューのSQL文
■構文
DROP VIEW ビュー名;
- ビューには実データは存在しないため、
ビューを削除してもデータは削除されない。
(Accessのクエリーを削除するのと同じ)
特に説明の必要なし
ビューは検索だけでなく、データの追加、更新、削除も行える。■注意点
- 元表から特定の列のみを取り出したビューに対して追加を行った場合、ビューに指定されていない列にはNULLが格納される。つまり、
ビューに指定されていない列にNOT NULL制約がある場合、追加がエラーになる。
ただし、DEFAULT句が定義されていれば可能。- データを加工(
結合、DISTINCT、グループ関数などを使用)しているビューに対して追加、更新、削除処理を行うことはできない。
(Oracle 7.3より、複数の表を結合したビューに対して追加、更新、削除処理が行えるようになった)- 更新の対象となる列に式が含まれていてはならない。
- 追加、更新、削除処理を行う場合、ビューのWHERE句は無視される。
追加、更新時にも条件部分をチェックさせたい場合は、ビュー作成時にWITH CHECK OPTION句を記述する。■WITH CHECK OPTION
ビューを使って更新するデータを、
ビューで表示可能なデータのみに制限する。
- 1.OPTIONなし
CREATE VIEW view1 AS
SELECT empno, ename, deptno FROM emp WHEREdeptno = 10;
《ビューが作成される》
INSERT INTO view1 VALUES (1010, 'JONY',20);
《view1を通してemp表にデータが追加される》 《view1をSELECTしても、追加したデータを見ることができない》- 2.OPTIONあり
CREATE VIEW view1 AS
SELECT empno, ename, deptno FROM emp WHEREdeptno = 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文で作成されたビューのうち、ビュー内の列に対してどんな更新も可能なものを選べ。
- CREATE VIEW emp_view AS SELECT DISTINCT job FROM emp;
- CREATE VIEW emp_view AS SELECT empno, ename, sal * 12 annsal FROM emp;
- CREATE VIEW emp_view AS SELECT deptno, AVG(sal) avgsal FROM emp FROUP BY deptno;
- CREATE VIEW emp_view AS SELECT * job FROM emp WITH READ ONLY;
- 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文を答えよ。
- UPDATE v_emp1 SET job = 'POST SALES' WHERE job = 'SALESMAN';
- UPDATE v_emp1 SET avg_sal = 1000 WHERE job = 'SALESMAN';
- INSERT INTO v_emp2 VALUES (1000, 'TOM', 'CLEAK', 7900, 1000, 500);
- UPDATE v_emp3 SET sal = 1000 WHERE empno = 7566;
- UPDATE v_emp3 SET sal = 1000 WHERE deptno = 30;
- DELETE FROM v_emp3 WHERE salary > 3000;