gpt4 book ai didi

sql-server - SQL 服务器 : Views that use SELECT * need to be recreated if the underlying table changes

转载 作者:行者123 更新时间:2023-12-04 07:48:55 24 4
gpt4 key购买 nike

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

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

然而,这可能会导致一些非常危险的情况。如果您忘记重新创建 View ,它将不会返回正确的数据。事实上,它可能会返回严重困惑的数据 - 列的名称全部错误且无序。

除非您碰巧将其包含在测试中,否则不会发现 View 错误,或者数据完整性检查失败。例如,Red Gate SQL Compare 没有发现需要重新创建 View 这一事实。

要重现该问题,请尝试以下语句:

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

我很想停止在 View 中使用 SELECT *,这将是一个 PITA。是否有某个地方可以解决这种行为?

最佳答案

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

但是,作为替代方案,您可以使您的 View 模式绑定(bind)。这样,您将无法在不重新创建 View 的情况下更改基础表。

关于sql-server - SQL 服务器 : Views that use SELECT * need to be recreated if the underlying table changes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2719428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com