SQL Server - テーブルを変更してもビューは自動的に更新されない

テーブルを変更してもビューは自動的に更新されない

今回は、面倒だからといって、View (ビュー)を定義する際に SELECT * FROM Table1 ... とアスタリスクを使って定義してしまうと、後で困るかもしれませんよ、というお話です。

アスタリスクを使って定義したテーブルの真ん中あたりにカラムを追加すると、View がどうなってしまうのか見てみましょう。


次のような Student テーブルがあります。

テーブルを変更してもビューは自動的に更新されない 1

テーブルを変更してもビューは自動的に更新されない 2


この Student テーブルのうち、男性のみ (Gender = 'M') をデータを取得する MaleStudent というビューを次のように定義します。

テーブルを変更してもビューは自動的に更新されない 3

テーブルを変更してもビューは自動的に更新されない 4


この状態から、Student テーブルの LastName の次に Age カラムを追加します。

テーブルを変更してもビューは自動的に更新されない 5


そして、MaleStudent ビューを SELECT してみると、次のように LastName より後ろのカラムと値がずれてしまっていますね。

テーブルを変更してもビューは自動的に更新されない 6


View (ビュー)の定義に SELECT * は使わない方がいい

上で確認したように、View で SELECT * を使って定義されているテーブルにカラムが追加されると、View のカラムと値がずれてしまいます。

何もエラーや警告なしで値だけがずれるので、気づきにくい不具合の原因になりかねません。

View を定義する際には、できる限り SELECT * は使わないほうが良いと思います。


ちなみに、テーブルからカラムを削除した場合は、View を SELECT した際に次のようなエラーになります。

「 ビューまたは関数 'dbo.MaleStudent' には定義された列数よりも多くの列名が指定されています。 」

テーブルを変更してもビューは自動的に更新されない 7

ビューをリフレッシュするには?

このようにテーブルの定義と合わなくなってしまった View をリフレッシュするには次のような方法があります。

以下のように sp_refreshview というシステムストアドプロシージャを使ってリフレッシュすることができます。

EXEC sp_refreshview 'ビューの名前';

テーブルを変更してもビューは自動的に更新されない 10


もしくは、SQL Server Management Studio から View の ALTER ステートメントを生成し、再実行してもリフレッシュされます。

テーブルを変更してもビューは自動的に更新されない 8

テーブルを変更してもビューは自動的に更新されない 9


やむを得ず、SELECT * を使って View を定義している場合は、テーブルの定義を更新した時は View 更新もお忘れなく!

© 2010-2024 SQL Server 入門