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

cbp*_*cbp 4 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
Run Code Online (Sandbox Code Playgroud)

我很想在视图中停止使用SELECT*,这将是一个PITA.某个地方是否有可能解决此问题的设置?

Rob*_*Day 8

你应该停止使用SELECT*.它总是会导致一些"非常危险"的情况.

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