如何使SQL Server中的依赖视图自动更新?

3

我们公司有人决定使用3个视图来支持网页,并且它们必须包含相同的子列。因此,我有如下定义:

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

我在依赖视图中使用了V.*的原因是,在支持视图发生更改时,我希望依赖视图能够反映这些更改。但在SQL Server中,除非我重新运行ALTER脚本,否则不会发生这种情况。为什么呢?是否有一种方法可以确保对支持视图的更改自动反映在依赖项中?

2个回答

5

还有一个sp_refreshsqlmodule,我更喜欢它,因为你可以用它来刷新不是视图的模块。如果要编写一个刷新所有视图的脚本,你可以这样做:

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;

更重要的是,这正是为什么在视图中不应该使用SELECT *原因


同意并接受作为答案。使用SELECT *不是一个合适的方式。我怀疑需要使用WITH SCHEMABINDING来确保视图保持一致。 - Colin
同意,特别是关于“这正是为什么你不应该在视图中使用SELECT *”的部分。 - Reversed Engineer
1
@Colin,你使用了 with schemabinding 吗?它有帮助你自动更新视图吗? - Saeed Neamati

2

1
如果这些视图之间存在依赖关系,例如一个视图A依赖于视图B,但是sp_refreshview首先在A上运行,然后在B上运行,这意味着A将不包含最新的B更改,该怎么办? - dim_user

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接