我偶尔会被迫使用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
但对我来说,这只是一个令人讨厌的解决方法......
任何提示?
答案 0 :(得分:7)
您需要在更改从sp_refreshview 'YourView'
中选择的表格的定义后调用*
。
答案 1 :(得分:2)
正如Martin所提到的,如果您更改基础表的定义并在视图中使用SELECT *
,则需要刷新视图。
避免这种情况的一个非常简单的方法是在您的观点中永远不要使用SELECT *
!
这是一种可怕的做法,可能会导致各种各样的问题。唯一的“好处”是您不需要在定义视图的一段时间内输入字段名称。