有没有办法让使用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。某个地方是否有可能解决此问题的设置?
答案 0 :(得分:8)
你应该停止使用SELECT *。它总会导致一些“非常危险”的情况。
但是,作为替代方案,您可以使视图架构绑定。这样,如果不重新创建视图,您将无法更改基础表。
答案 1 :(得分:0)
有没有办法让使用SELECT *的视图与基础表保持同步。
当然:更新基础表架构时更新它们:)。严肃认真,没有办法自动更新使用SELECT *的视图,这是避免它的众多原因之一。更好的方法是显式枚举视图中的列,并在运行模式更新脚本时(它们是脚本化的,以便它们可以直接进入源代码管理?),您只需要在必要时包含对视图的更新。