読者です 読者をやめる 読者になる 読者になる

小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Oracleで試すはじめてのビュー(view)

ビュー(view)とは

ビューは、テーブルから作成される仮想的なテーブルです。ビューの中にはデータがありません。データが格納された実テーブルをどのように参照するのかを定義したものがビューになります。
この記事では、以下のテスト用のテーブル(table01)のビューを作成してみます。
f:id:replication:20150309235105p:plain

オラクルマスター教科書 Bronze Oracle Database DBA12c
林 優子
翔泳社
売り上げランキング: 67,212

ビュー(view)を作成する

Oracleでビューを作成するには、以下のクエリを使います。

CREATE VIEW ビューの名前 AS ビューを作成する条件;
CREATE VIEW table01_view AS SELECT * FROM table01;
SQL> CREATE VIEW table01_view AS SELECT * FROM table01;
CREATE VIEW table01_view AS SELECT * FROM table01
            *
行1でエラーが発生しました。:
ORA-01031: 権限が不足しています。

ORA-01031のエラーになった場合は、sysdbaの権限でCREATE VIEWのシステム権限を付与してあげます。

GRANT CREATE VIEW to hoge;

権限を付与しなおして、再度ビューを作成します。

SQL> CREATE VIEW table01_view AS SELECT * FROM table01;
ビューが作成されました。

今度は、うまくいきました。

ビューを参照する

ビューの参照はテーブルと同じように参照することができます。

select * from table01_view;

descコマンドの結果も同じですね。
f:id:replication:20150310003536p:plain

ビューのメリット
  • 複雑なクエリの再利用
  • 実テーブルに対するアクセス制御

ビューにアクセスすると、定義されたクエリが実行され、実テーブルから必要なデータが抽出されます。あらかじめ毎回入力するのが面倒な複雑なクエリを一度ビューとして定義しておけば、ユーザやプログラムは単純なクエリを実行するだけですみます。

このような開発労力の軽減という観点以外に、セキュリティについてもメリットもあります。見せたくないデータを除いたビューを定義することにより、一般ユーザでも実テーブルのデータを利用できるようになります。
[SQL] 9. ビュー 1 | TECHSCORE(テックスコア) はてなブックマーク - [SQL] 9. ビュー 1 | TECHSCORE(テックスコア)

ビューは更新できる

ビューに対して更新を行うと、実体のテーブルの方にも変更が反映されます。

delete from table01_view where id = '00000001';
>1行が削除されました。

エイリアスみたいですね。

ビューを経由した実テーブルの更新はNG

NGと書きましたが、できないことはないが、やらないほうが良いという意味です。
ぱっと見、実テーブルを更新しているように見えないのでわかりにくいです。複数のテーブルを参照するビューに対する更新を許可した場合、実テーブルがどのように更新されるか見えにくくなります。

更新禁止のビュー

更新禁止のビューというのも作成できます。以下の例では、table01_viewを作成する際、WITH READ ONLYを指定して読み取り専用にしています。

CREATE OR REPLACE VIEW table01_view AS SELECT * FROM table01 WITH READ ONLY;

ビューのアクセス制御は、権限側でコントロールするのが良いという意見もあります。
WITH READ ONLY も、SQLインターフェイスのユーザに対する更新のリスクを無くす為であると思われます。アプリケーションであれば、VIEW に対して更新コードさえ書かなければ(そういう仕様がなければ)必要ありません。本来は、「権限」でコントロールすべきものでしょう。
ビューの功罪 はてなブックマーク - ビューの功罪

読み取り専用のビューに対して更新をかけると、ORA-42399となります。

ORA-42399: 読取り専用ビューではDML操作を実行できません

ビューの削除

ビューの削除は、drop viewで削除します。

DROP VIEW ビューの名前
DROP VIEW table01_view;