3

私たちの会社の誰かが、Webページをサポートするために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.*を実行した理由は、サポートビューが変更された場合に、依存ビューに変更を反映させたいためです。ただし、スクリプトをALTERスクリプトとして再実行しない限り、SQLServerでは発生しません。なぜだめですか?また、サポートビューへの変更が依存関係に自動的に反映されるようにする方法はありますか?

4

2 に答える 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 *理由です。

于 2012-09-19T14:43:29.647 に答える
2

sp_refreshview

sp_refreshview [ @viewname = ] 'viewname' 

SQL Server –すべてのビューを更新します

于 2012-09-19T14:08:46.080 に答える