ようこそ。睡眠不足なプログラマのチラ裏です。

SQL Server 2005 ビュー


標準のビューと、WITH CHECK OPTION句

標準のビューでは1つ以上のベーステーブルのデータを仮想的な単一のテーブルのデータとして提供する。
ビューは、データ行ではなく、定義のみが保存される。ビューが参照されると、データベースエンジンは
ベースとなるテーブルかrあ、そのビュー定義に対応するデータ行を動的に返します。
ビューを使用することで、直接ベースとなるテーブルにアクセスする必要がなくなるため、
クエリの複雑さを低減することができ、セキュリティの向上が期待できる。


複数のベーステーブルを持つビューの場合、同時に複数のテーブルを変更しない限りは、
ビューを使用して、データを変更することができる、ただし、ビューに対して行を追加、更新するとき、
ビューの定義に合わなくなってしまったデータは当然、ビューに表示されなくなってしまう。
ビューを定義する際に、WIHT CHECK OPTION句を指定することで、このような現象を回避することができる。

ALTER VIEW V_TEST
AS
SELECT BUMON_NAME,SHAIN_NAME,SEX,AGE,ADDRESS
FROM TEST_DB.BUMON
JOIN TEST_DB.SHAIN
ON TEST_DB.BUMON.BUMON_ID = TEST_DB.SHAIN.BUMON_ID
WHERE AGE >=20
WITH CHECK OPTION
GO

WITH CHECK OPTION句を指定したビューに対してビューの定義の範囲外の値に
データを変更しようとすると、メッセージ550エラーとなり、変更はキャンセルされる。


インデックス付きビューによるパフォーマンスの向上

複数のベーステーブルから作成されるビューやビューの中で集計を行っている場合、
ビューに一意なクラスタ化インデックスを作成することでパフォーマンスを向上することができる。
インデックス付きビューは多くの行を集計するクエリで最も効果を発揮するが、
逆に頻繁に更新されるベーステーブルをもつビューについては、オーバーヘッドがかかるため適さない。


ビューにインデックスを作成できる条件
・CREATE VIEW ステートメント実行時、ANSI_NULLSオプションとQUOTED_IDENTIFIERオプションがONに設定されていること。
・ビューで参照するベーステーブルの作成時にもANSI_NULLSオプションがONに設定されていること。
・ビューが参照しているのはベーステーブルのみで、他のビュー参照していないこと
・ビューで参照されるすべてのベーステーブルは、ビューと同じデータベース内に存在し、ビューと同じ所有者であること。
・ビューはWITH SCHEMABINDINGオプションを使用して作成されていること。*1
・ビューで参照されるユーザ定義関数は、SCHEMABINDINGオプションを使用して作成済みであること。
・ビューでは、テーブルとユーザ定義関数について、スキマー名.オブジェクト名の2つの要素で構成される名前で参照すること。
・ビュー内の式で参照される関数は決定的であること。決定的であるとは、関数の引数に同じ値を渡した場合、
常に同じ値が返される状態を指す。これに対して、GETDATEやNEWID関数は、実行する度に異なる値が返されるので
非決定的関数と言える。

*1:スキーマバインドによってベーステーブルのスキーマにビューが結合される