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

时间:2010-04-27 07:27:24

标签: sql-server

有没有办法让使用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 *,这将是一个PITA。某个地方是否有可能解决此问题的设置?

2 个答案:

答案 0 :(得分:8)

你应该停止使用SELECT *。它总会导致一些“非常危险”的情况。

但是,作为替代方案,您可以使视图架构绑定。这样,如果不重新创建视图,您将无法更改基础表。

答案 1 :(得分:0)

  

有没有办法让使用SELECT *的视图与基础表保持同步。

当然:更新基础表架构时更新它们:)。严肃认真,没有办法自动更新使用SELECT *的视图,这是避免它的众多原因之一。更好的方法是显式枚举视图中的列,并在运行模式更新脚本时(它们是脚本化的,以便它们可以直接进入源代码管理?),您只需要在必要时包含对视图的更新。