SQL Server:如果底层表发生更改,则使用SELECT *的视图需要重新创建。

4
有没有办法让使用SELECT *的视图与基础表保持同步?
我发现,如果对所有列进行选择的基础表发生更改,则需要“重新创建”视图。这可以通过运行ALTER VIEW语句来实现。
但是,这可能会导致一些非常危险的情况。如果您忘记重新创建视图,则它将不返回正确数据。实际上,它可能会返回严重错误的数据-列名全错了且顺序也错了。
除非您已经对其进行了测试或数据完整性检查失败,否则没有任何东西能够发现视图是错误的。例如,Red Gate SQL Compare不能发现需要重新创建视图的事实。
要复制问题,请尝试以下语句:
CREATE TABLE Foobar (Bar varchar(20))

CREATE VIEW v_Foobar AS SELECT * FROM Foobar

INSERT INTO Foobar (Bar) VALUES ('Hi there')

SELECT * FROM v_Foobar

ALTER TABLE Foobar
ADD Baz varchar(20)

SELECT * FROM v_Foobar

DROP VIEW v_Foobar
DROP TABLE Foobar

我很想停止在视图中使用SELECT *,但这将会很麻烦。也许有某个设置可以修复这种行为吗?


6
视图中不要使用SELECT *,而是使用明确的列清单。 - Mitch Wheat
2个回答

8

建议您停止使用SELECT *,因为它可能会导致一些“相当危险”的情况。

不过,您可以选择创建基于模式的视图作为替代方法。这样,如果要更改底层表格,则必须重新创建视图,从而避免了潜在的问题。


喜欢使用模式来限制视图,以强制用户删除和创建视图的想法。 - Thomas

0
有没有办法使使用SELECT *的视图与底层表保持同步?
当然可以:在更新底层表模式时同时更新它们 :)。说真的,没有自动更新使用SELECT *的视图的方法,这也是避免使用它的许多原因之一。更好的方法是在视图中明确枚举列,并在运行模式更新脚本时(它们是脚本化的,因此可以放入源代码控制中,对吧?)如果需要,只需包括对视图的更新即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接