天天看點

更新表結構的同時更新相應的視圖

 當修改一個表結構時(增加和删除列),引用到該表的視圖并不會自動更新,這樣就有可能導緻一些問題。

比如:

有一個表T1有兩列C1,C2.

視圖VW1為:CREATE VIEW VW1 AS SELECT * FROM T1

如果增加列C3後,視圖VW1執行的結果還是隻有兩列C1,C2

有幾種方法來手動更新這個視圖

1)重新執行視圖腳本:CREATE VIEW VW1 AS SELECT * FROM T1

2)調用系統存儲過程“ sp_refreshview”,來更新視圖:EXEC sp_refreshview [VW1]

(試了 sp_recompile [VW1] 不起作用,不知它重新編譯時幹了什麼)

這是知道該表被哪些視圖引用的情況,如果不知道該表被哪些視圖引用,可以用以下腳本:

SELECT DISTINCT 'EXEC sp_refreshview ''' + name + ''''

FROM sys.objects so INNER JOIN sys.sql_dependencies sd

ON so.object_id = sd.object_id

WHERE so.type = 'V'

AND sd.referenced_major_id = object_id('T1')

同理,也可找出引用它的存儲過程來手動做一些修改:

SELECT DISTINCT name

FROM sys.objects so INNER JOIN sys.sql_dependencies sd

ON so.object_id = sd.object_id

WHERE so.type = 'P'

AND sd.referenced_major_id = object_id('T1')

或者幹脆周遊更新一遍所有視圖: http://www.ssw.com.au/SSW/KB/KB.aspx?KBID=Q1000592

DECLARE @ObjectName varchar (255)

DECLARE tnames_cursor CURSOR FOR SELECT name FROM sysobjects

    WHERE type = 'V' AND uid = 1 Order By Name

OPEN tnames_cursor

FETCH NEXT FROM tnames_cursor INTO @Objectname

WHILE (@@fetch_status <> -1)

BEGIN

    IF (@@fetch_status <> -2)

    BEGIN

        SELECT @ObjectName_header = 'Refreshing ' + @ObjectName

        PRINT @ObjectName_header

        EXEC('sp_refreshview ' + @ObjectName)

    END

    FETCH NEXT FROM tnames_cursor INTO @ObjectName

END

繼續閱讀