C# Programming

SQL 2008

VIEW

 

1.目次

1.目次
2.ビューのメリット
3.ビューの例
4.ビューの構文
5.ビューの更新
6.ビューの高速化 (クラスタ化インデックス付きビュー)

2.ビューのメリット

 
メリット 使い方
セキュリティの強化 特定の行だけにアクセス制限 従業員は自分の記録しか見えないようにする。
セキュリティの強化 特定の列だけにアクセス制限 従業員は名前、電話番号は見えるが、勤務評定は見えないようにする。
簡易化 複数のテーブルの列を結合し、単一のテーブルで表示 郵便番号テーブルと県名テーブル、市町村名テーブルを結合する。
分割の統合 水平方法に分割されたテーブルを結合 関東支社、関西支社に水平に分割されたテーブルを結合して、1つに見せる。

3.ビューの例

pubs データベースで、著者、タイトルのリストを作ろうと思うと、N対Nの関係になっているので、次の図のように3つのテーブルにアクセスする必要があります。このような場合にはビューを使うと簡単になります。

Image

ビューの作成例
USE pubs
GO
IF EXISTS(SELECT name from sysobjects where name = 'MyTitleView')
BEGIN
	print 'exists'
	print 'drop View'
	Drop View MyTitleView 
END
GO

CREATE VIEW MyTitleView (title, au_lname, au_fname)
AS
SELECT title, au_lname, au_fname
FROM dbo.authors INNER JOIN dbo.titleauthor ON authors.au_id=titleauthor.au_id 
INNER JOIN titles ON titles.title_id=titleauthor.title_id
GO	
これにより

SELECT * from MyTitleView 

テーブルを参照するのと同様に参照できます。

Image

4.ビューの構文

CREATE VIEW [ < owner > .] view_name [ ( column [ ,...n ] ) ]
[ WITH < view_attribute > [
,...n ] ]
AS
select_statement
[ WITH CHECK OPTION ]

< view_attribute > ::=

    { ENCRYPTION | SCHEMABINDING | VIEW_METADATA }

5.ビューの更新

ビューが参照するテーブルが1 つだけの場合は、INSERT, UPDATE, DELETE による更新が可能 です。逆に言えば、更新ができてしまいますので、注意が必要です。

以下の例は、Pubs.Authors テーブルにビューを作成し、INSERT, UPDATE, DELETEを実行して います。

USE pubs
GO
IF EXISTS(SELECT name from sysobjects where name = 'MyAuthorView')
BEGIN
print 'exists'
print 'drop View'
Drop View MyAuthorView 
END
GO

CREATE VIEW MyAuthorView (au_id, au_lname, au_fname, contract)
AS
SELECT au_id, au_lname, au_fname, contract
FROM dbo.authors
GO
INSERT INTO MyAuthorView(au_id, au_lname, au_fname, contract)
VALUES('999-99-0001', 'Uchu', 'Kamen', 1)

SELECT * FROM MyAuthorView WHERE au_lname='Uchu'

UPDATE MyAuthorView
SET au_lname='宇宙', au_fname='仮面'
WHERE au_id='999-99-0001'

SELECT * FROM MyAuthorView WHERE au_id='999-99-0001'

DELETE MyAuthorView WHERE au_id='999-99-0001'
Image

しかし、ビューが複数のベーステーブルから構成されている場合、INSERT, UPDATE, DELETE による更新はできません。次は、MyTitleViewに対して INSERTを行おうとした場合です。「変更が複数のベース テーブルに影響するので、ビューまたは関数 'MyTitleView' は更新可能ではありません。」というエラーが発生して、挿入できません。

Image

6.ビューの高速化 (クラスタ化インデックス付きビュー)

標準的なビューの結果セットは、データベースに永続的に格納されません。クエリがビューを参照するたびに、ビューの結果セットを構築するのに必要なロジックと、ベース テーブルのデータから完全なクエリ結果セットを構築するのに必要なロジックを動的にマージします。

このため、多量のデータの集計、多数の行の結合など多量の行を複雑に処理するビューの場合、オーバヘッドが大きくなります。このような場合は、ビュー上に一意なクラスタ化インデックスを作成することにより、ビューの高速化を行うことができます。

この場合スキーマが変更されてしまうと、整合性が取れなくなってしまうので、SCHEMABINDINGを指定する必要があります。