ビュー(VIEW)の作成と管理
1. ビューとは
RDB(リレーショナルデータベース)では、データを正規化した表が設計されています。このままの構造ではアプリケーションが複雑になったり、セキュリティ上問題があったりします。ビューは、表や列を限定したり、表を結合してデータを表現することができます。ビューを使用することで、【セキュリティ向上】【データ加工】などの利点があります。
ビューには単一ビューと複合ビューがあります。単一ビューは、1つの表から構成され、「関数を含まない」、「グループを含まない」、「ビューからの挿入、更新、削除が可能」などの特徴を持っています。複合ビューは、複数の表から構成され「関数を含む」、「グループを含む」、「条件付きでビューから挿入、更新、削除が可能」などの特徴を持っています。
2. ビューの作成(CREATE VIEW)
※ビューの検索・更新・削除で使用するので、ビュー作成の前に元表にデータ挿入を行っています。
SQL> insert into 部署
2 values (30,'営業','大阪');
1行が作成されました。
SQL> insert into 従業員
2 values (1111,'安藤','営業',7788,TO_DATE('1999-04-01','yyyy-mm-dd'),240000,5000,30);
1行が作成されました。
SQL> CREATE VIEW 従業員_営業ビュー (NO,名前,部署) AS ・・・・・従業員_営業ビュー表の作成
2 SELECT 従業員NO,従業員名,部署NO
3 FROM 従業員
4 WHERE 部署NO=30;
ビューが作成されました。
SQL> DESC 従業員_営業ビュー
名前 NULL? 型
----- -------- --------------------
NO NOT NULL NUMBER(4)
名前 VARCHAR2(10)
部署 NUMBER(2)
SQL> SELECT * FROM 従業員_営業ビュー;
NO 名前
---------- --------------------
1111 安藤
SQL> CREATE VIEW 営業ビュー_CHECK (NO,名前,部署) AS ・・・・WITH CHECK OPTIONビュー表作成
2 SELECT 従業員NO,従業員名,部署NO
3 FROM 従業員
4 WHERE 部署NO=30
5 WITH CHECK OPTION;
ビューが作成されました。
SQL> DESC 従業員_営業ビュー
名前 NULL? 型
----- -------- --------------------
NO NOT NULL NUMBER(4)
名前 VARCHAR2(10)
部署 NUMBER(2)
SQL> SELECT * FROM 従業員_営業ビュー;
NO 名前
---------- --------------------
1111 安藤
SQL> CREATE VIEW 営業ビュー_READONRY (NO,名前,部署) AS ・・・・WITH READ ONLYビュー表作成
2 SELECT 従業員NO,従業員名,部署NO
3 FROM 従業員
4 WHERE 部署NO=30
5 WITH READ ONLY;
ビューが作成されました。
SQL> DESC 従業員_営業ビュー
名前 NULL? 型
----- -------- --------------------
NO NOT NULL NUMBER(4)
名前 VARCHAR2(10)
部署 NUMBER(2)
SQL> SELECT * FROM 従業員_営業ビュー;
NO 名前
---------- --------------------
1111 安藤
SQL> CREATE VIEW SUMMARY AS ・・・・GROUP BYを使用したSUMMARYビューの作成
2 SELECT 部署NO,SUM(給与) 給与合計
3 FROM 従業員
4 GROUP BY 部署NO;
ビューが作成されました。
SQL> DESC SUMMARY
名前 NULL? 型
------- -------- --------------------------
部署NO NUMBER(2)
給与合計 NUMBER
SQL> SELECT * FROM SUMMARY;
部署NO 給与合計
---------- ----------
30 240000
|
※「CREATE OR REPLACE VIEW」文では、同一スキーマ内にビューが存在していれば上書きを、なければ新規作成すします。CREATE VIEWコマンドは、各列に別名を付けることが可能です。セキュリティの観点からみると列に別名を付けるのが好ましいといえます。上記の例では、(NO、名前)という別名をVIEW列に付与しています。またCREATE VIEWコマンドには「FORCE」「NOFORCE」オプションがあり元表に定義がなくても「FORCE」オプションで強制的にビューを作成できます。デフォルトでは「NOFORCE」オプションになっており、元表に定義がないとビューの作成ができません。
3. ビューと通した検索・更新・削除
ビュー表のデータ挿入・データ更新・データ削除の際には以下のような制限事項があります。
DISTINCT演算子、GROUP BY句またはグループ関数(SUMなど)を使用したビューへのINSERT/UPDATE/DELETEはできない。
WITH CHECK OPTION句が定義されたビューは、作成時のWHERE句の条件を元に判断される。
WITH READ ONLY句が定義されたビューは、INSERT/UPDATE/DELETEはできない。
|
@検索
ビューに対する問い合わせは、ビューの作成時に副問い合わせで指定した表に対して行われます。ビューの利用者はビューというフィルターを通してビューの元となる表のデータにアクセスできます。このフィルターによりセキュリティの向上を実現できます。
SQL> SELECT * FROM 従業員_営業ビュー;
NO 名前
---------- --------------------
1111 安藤
|
A挿入・更新・削除
SELECT文とは異なり、ここからはビューに対する制限事項が関わってきます。上記で紹介した制限事項とビュー作成で指定した様々な制約事項が挿入・更新・削除の時にどのように作用するか検証していきたいと思います。
@ここでは制限なしで作成した従業員_営業ビュー表への操作を見ていきます。制限なしのために部署が20の場合もINSERT文を実行できることに注目してください。
SQL> INSERT INTO 従業員_営業ビュー
2 VALUES(3333,'堀江',30);
1行が作成されました。
SQL> SELECT * FROM 従業員_営業ビュー ;
NO 名前 部署
---------- -------------------- ----------
1111 安藤 30
3333 堀江 30
SQL> INSERT INTO 従業員_営業ビュー
2 VALUES(4444,'田中',20);
1行が作成されました。
SQL> SELECT * FROM 従業員_営業ビュー ;
NO 名前 部署
---------- -------------------- ----------
1111 安藤 30
3333 堀江 30
AWITH CHECK OPTIONを指定して作成した営業ビュー_CHECKビュー表への操作を見ていきます。作成時のWHERE句の条件が適用されていることが分かると思います。
SQL> INSERT INTO 営業ビュー_CHECK
2 VALUES(4444,'田中',20);
INSERT INTO 営業ビュー_CHECK
*
行1でエラーが発生しました。:
ORA-01402: ビューのWITH CHECK OPTION WHERE句でエラーが発生しました。
BWITH READ ONLYを指定して作成した営業ビュー_READONLYビュー表への操作を見ていきます。挿入・更新・削除処理が実行不能ということが分かると思います。
SQL> UPDATE 営業ビュー_READONRY
2 SET 名前='佐藤'
3 WHERE 名前='安藤';
SET 名前='佐藤'
*
行2でエラーが発生しました。:
ORA-01733: ここでは仮想列は使用できません。
SQL> DELETE FROM 営業ビュー_READONRY
2 WHERE 名前='安藤';
DELETE FROM 営業ビュー_READONRY
*
行1でエラーが発生しました。:
ORA-01752: 複数表のビューから削除できません。
BWGROUP BYとグループ関数を指定して作成したSUMMARYビュー表への操作を見ていきます。挿入・更新・削除処理が実行不能ということが分かると思います。
2 SET 給与合計=200000
3 WHERE 給与合計=240000;
UPDATE SUMMARY
*
行1でエラーが発生しました。:
ORA-01732: このビューではデータ操作が無効です
|
|
スポンサードリンク
|