ビュー VIEW
ビューとは 1 つ、または、複数の表から選択 (WHERE) と射影 (SELECT column) を施した出力結果を表形式にしたものである。
ビューとシノニム(テーブルの参照)の違い
ビューとシノニムの定義
hoo が所有する表 hoge にシノニム hoge_alias と ビュー hoge_view を定義している例
CREATE VIEW hoge_view AS SELECT * FROM hoo.hoge;
CREATE SYNONYM my.hoge_alias FOR hoo.hoge;
この定義の場合には、どちらも同じ結果を戻すが内部で行なわれる処理内容も処理コストも異なっている。
- SQL 文による シノニム と ビュー の違い(イメージ)
SELECT * FROM my.hoge_xxx WHERE col = 'hogehoge';
my.hoge_xxx がシノニム定義であれば
SELECT * FROM hoo.hoge AS my.hoge_xxx WHERE col = 'hogehoge';
my.hoge_xxx がビュー定義であれば
SELECT * FROM (
SELECT * FROM hoo.hoge
-- ↑ データディクショナリのビュー定義から SELECT 文を取り出して全体を再構築
) AS my.hoge_xxx
WHERE col = 'hogehoge';
のような インラインビュー(※1) のイメージとなる。
シノニムの条件句は常にテーブルへの条件と同じである一方でビューへの条件句はオプティマイザがビューの定義と条件句をマージして、ひとつの SQL に変換することができるかを判断し内部で SQL を再構築する。(※2)
(※1) インラインビューとは、SQL の 中(インライン)に直接記述するビューのこと。しかし、厳密には ビュー(スキーマオブジェクト)ではなく FROM の後ろに書かれた 「副問合せ」 である。
(※2) 再構築といってもオプティマイザが暗黙的に処理するので、マテリアライズド・ビューのときのようにクエリーリライト権限付与は必要ない 参考: クエリー・リライト
CREATE VIEW 構文
ビューを作成するための基本構文。テーブルのような ALTER 構文ではなく ストアドプロシージャ のように再定義(CREATE OR REPLACE)を行なう。
CREATE [OR REPLACE] [FORCE| NOFORCE] view_name
[ (column_name [,column_name2 ..] ) ]
AS SELECT column_name [,column_name2 ..] FROM table_name
[ WITH CHECK OPTION [CONSTRAINT constraint_name] ]
[ WITH READ ONLY [ CONSTRAIT constraint_name] ]
更新可能なビュー
更新可能なビューとは、文字通り UPDATE 可能なビューのことであり、通常のビューだけに限らず、インラインビューでも実行することが可能。更新できる条件には、テーブル結合, 集合演算子(UNION ALL / INTERSECT / MINUS), GROUP BY句, グループ関数, DISTINCT 演算子 を含んでいないことが必要である。
更新する対象テーブルの ROWID が SELECT できるかというのが大まかな判断となる(※)。 また更新可能なビューであっても列データを直接参照ではなく編集した場合も仮想列項目として更新できない項目となる。
(※) UNION ALL を使用したビューは ROWID を決定することができるが、今のところでは更新可能なビューに含まれていない。(Oracle 10g 時点)
UPDATE
{ view_name |
( SELECT a.col colname
FROM table_a, table_b
WHERE table_a.col2 = table_b.col2
) }
SET colname = 'XXX'
WHERE ...
ビューと表関数
ビューは SQL によって表データの閲覧を制御する 表関数 の一種とも言える。(ビューの方が歴史がある)
このビューのストアドプロシージャ的な特性はビューを定義時に良く遭遇するエラーにおいても垣間見ることができる。
- ユーザー my は DBA ロールを所持しており hoo.hoge 表をロール経由で見ることができる場合
SQL> CREATE SYNONYM my.hoge_alias FOR hoo.hoge;
シノニムが作成されました。
SQL> CREATE VIEW my.hoge_view AS SELECT * FROM hoo.hoge ;
行1でエラーが発生しました。:
ORA-01031: 権限が不足しています。
ビューを定義するにはシノニムとは異なり、作業前にロール経由ではなく個別に表への SELECT 権限が必要となる。(更新可能なビューの場合にはそれぞれに必要な権限を与える)
これは SELECT 権限がない場合に定義者権限の PL/SQL から他のスキーマの表を参照しているときに発生する ORA-01031 エラー
と同じであり、ストアドプロシージャ的な特性がわかりやすくあらわれている例といえる。なお、ビューの作成後に権限を REVOKE した場合には ビューを SELECT 時にエラーが発生する。
ビュー関連事項