SQL Server - テーブルを変更してもビューは自動的に更新されない
テーブルを変更してもビューは自動的に更新されない
今回は、面倒だからといって、View (ビュー)を定義する際に SELECT * FROM Table1 ... とアスタリスクを使って定義してしまうと、後で困るかもしれませんよ、というお話です。
アスタリスクを使って定義したテーブルの真ん中あたりにカラムを追加すると、View がどうなってしまうのか見てみましょう。
次のような Student テーブルがあります。
この Student テーブルのうち、男性のみ (Gender = 'M') をデータを取得する MaleStudent というビューを次のように定義します。
この状態から、Student テーブルの LastName の次に Age カラムを追加します。
そして、MaleStudent ビューを SELECT してみると、次のように LastName より後ろのカラムと値がずれてしまっていますね。
View (ビュー)の定義に SELECT * は使わない方がいい
上で確認したように、View で SELECT * を使って定義されているテーブルにカラムが追加されると、View のカラムと値がずれてしまいます。
何もエラーや警告なしで値だけがずれるので、気づきにくい不具合の原因になりかねません。
View を定義する際には、できる限り SELECT * は使わないほうが良いと思います。
ちなみに、テーブルからカラムを削除した場合は、View を SELECT した際に次のようなエラーになります。
「 ビューまたは関数 'dbo.MaleStudent' には定義された列数よりも多くの列名が指定されています。 」
ビューをリフレッシュするには?
このようにテーブルの定義と合わなくなってしまった View をリフレッシュするには次のような方法があります。
以下のように sp_refreshview というシステムストアドプロシージャを使ってリフレッシュすることができます。
EXEC sp_refreshview 'ビューの名前';
もしくは、SQL Server Management Studio から View の ALTER ステートメントを生成し、再実行してもリフレッシュされます。
やむを得ず、SELECT * を使って View を定義している場合は、テーブルの定義を更新した時は View 更新もお忘れなく!