gpt4 book ai didi

sql-server - 如何让依赖 View 在 SQL Server 中自动更新?

转载 作者:行者123 更新时间:2023-12-01 06:19:30 24 4
gpt4 key购买 nike

我们公司的某个人决定使用 3 个 View 来支持网页,并且它们必须包含相同列的子集。所以我有这样的定义:

CREATE VIEW EmailReceivedView
AS
SELECT
dbo.EmailReceived.ID
, ...lots of columns
FROM dbo.EmailReceived
LEFT OUTER JOIN ...more tables

--Emails related to reviews
CREATE VIEW ReviewEmailReceivedView
AS
SELECT RV.ReviewID, V.*
FROM ReviewEmailReceived RV
INNER JOIN EmailReceivedView V ON EmailReceivedID = V.ID

--Emails related to grants
CREATE VIEW GrantEmailReceivedView
AS
SELECT GV.GrantID, V.*
FROM GrantEmailReceived GV
INNER JOIN EmailReceivedView V ON GV.EmailReceivedID = V.ID

现在我在从属 View 中使用 V.* 的原因是,如果支持 View 发生变化,我希望从属 View 反射(reflect)这些变化。但这在 SQL Server 中不会发生,除非我将脚本重新运行为 ALTER 脚本。为什么不?有没有办法确保对支持 View 的更改自动反射(reflect)在依赖项中?

最佳答案

还有sp_refreshsqlmodule我更喜欢它只是因为你也可以将它用于不是 View 的模块。不过,要构建一个刷新所有 View 的脚本,您可以这样做:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
EXEC sys.sp_refreshsqlmodule 'N''
+ QUOTENAME(s.name) + N'.'
+ QUOTENAME(v.name) + N''';'
FROM sys.views AS v
INNER JOIN sys.schemas AS s
ON v.[schema_id] = s.[schema_id]
WHERE v.is_ms_shipped = 0
-- AND v.name LIKE '%EmailReceivedView%'
;

PRINT @sql;
-- EXEC sys.sp_executesql @sql;

但更重要的是,这正是为什么you shouldn't use SELECT * in a view .

关于sql-server - 如何让依赖 View 在 SQL Server 中自动更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12496465/

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