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

Sql server SQL Server:如果基础表发生更改,则需要重新创建使用SELECT*的视图,sql-server,Sql Server,是否有方法使使用SELECT*的视图与基础表保持同步 我发现,如果对基础表进行了更改(从中选择所有列),则需要“重新创建”视图。这可以通过运行ALTERVIEW语句简单地实现 然而,这可能导致一些相当危险的情况。如果忘记重新创建视图,它将不会返回正确的数据。事实上,它可能返回严重混乱的数据——列的名称都是错误的和无序的 除非测试覆盖了视图,或者数据完整性检查失败,否则不会发现视图错误。例如,Red Gate SQL Compare没有发现需要重新创建视图的事实 要复制问题,请尝试以下语句: CR

是否有方法使使用SELECT*的视图与基础表保持同步

我发现,如果对基础表进行了更改(从中选择所有列),则需要“重新创建”视图。这可以通过运行ALTERVIEW语句简单地实现

然而,这可能导致一些相当危险的情况。如果忘记重新创建视图,它将不会返回正确的数据。事实上,它可能返回严重混乱的数据——列的名称都是错误的和无序的

除非测试覆盖了视图,或者数据完整性检查失败,否则不会发现视图错误。例如,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。是否有可能修复此行为的设置?

您应该停止使用SELECT*。它总是会导致一些“相当危险”的情况

但是,也可以将视图绑定到模式。这样,如果不重新创建视图,就无法更改基础表

是否有方法使使用SELECT*的视图与基础表保持同步


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

不要在视图中使用SELECT*;取而代之的是使用一个显式的列列表,比如模式绑定视图的想法,强制人们删除并创建视图。