在MS-SQL中更改表时,视图中的列会被替换

时间:2011-11-14 13:55:01

标签: sql sql-server

我偶尔会被迫使用MS-SQL,所以我对它的了解是基本的。我确信以下问题对于MS-SQL专家来说是件小事,但对我来说这看起来真的像一个讨厌的bug:

假设我有一个简单的表格,其中包含一个人的姓氏,名字和电子邮件,如下所示:

CREATE TABLE dbo.people
(
lastName varchar(50) NULL,
firstName varchar(50) NULL,
email varchar(50) NULL
)

现在我要创建一个视图,所以我有一些预先连接的字段,如下所示:

CREATE VIEW v_people AS
SELECT
    people.*,
    people.lastName + ' ' + people.firstName AS concatName
FROM people

现在我注意到我忘记了电话号码字段,并改变了原始表格,但仅限于表格,而不是视图:

ALTER TABLE dbo.people ADD
phone varchar(50) NULL

酷,也有效。但是现在发生在视图中的事情非常糟糕:视图字段'concatName'不包含连接的名称,而是电话号码,即使视图字段仍然是相同的数量和名称!

似乎MS-SQL只是移动视图中的数据列而不更新列定义。非常糟糕的情况,如果你忘记更新依赖于你改变的表的视图......

我是否已经监督了某些事情,或者我是否真的有责任在我添加新的表格列时始终检查/更改所有视图?有没有办法让MS-SQL服务器至少抛出依赖视图的警告?

我注意到如果视图的构造方式不会发生:

CREATE VIEW v_people AS
SELECT
    people.lastName + ' ' + people.firstName AS concatName,
    people.*
FROM people

但对我来说,这只是一个令人讨厌的解决方法......

任何提示?

2 个答案:

答案 0 :(得分:7)

您需要在更改从sp_refreshview 'YourView'中选择的表格的定义后调用*

答案 1 :(得分:2)

正如Martin所提到的,如果您更改基础表的定义并在视图中使用SELECT *,则需要刷新视图。

避免这种情况的一个非常简单的方法是在您的观点中永远不要使用SELECT *

这是一种可怕的做法,可能会导致各种各样的问题。唯一的“好处”是您不需要在定义视图的一段时间内输入字段名称。