過去幾天我開發了很多後端,而且在我們使用中央數據庫腳本的時候,我只寫了普通的舊SQL升級腳本,並將它們執行到數據庫。那麼好吧,但爲什麼必須寫'刷新視圖'腳本,並執行它們,每次我添加或編輯視圖的一些領域。爲什麼SQL Server視圖需要每隔一段時間刷新一次
SQL Server知道在Management Studio中花哨的視圖編輯窗口編輯視圖時需要刷新視圖,爲什麼不能通過腳本編輯視圖後告訴視圖自己刷新自己?
過去幾天我開發了很多後端,而且在我們使用中央數據庫腳本的時候,我只寫了普通的舊SQL升級腳本,並將它們執行到數據庫。那麼好吧,但爲什麼必須寫'刷新視圖'腳本,並執行它們,每次我添加或編輯視圖的一些領域。爲什麼SQL Server視圖需要每隔一段時間刷新一次
SQL Server知道在Management Studio中花哨的視圖編輯窗口編輯視圖時需要刷新視圖,爲什麼不能通過腳本編輯視圖後告訴視圖自己刷新自己?
如果基礎表完全改變,則需要刷新視圖。這可以更改視圖的列的數據類型或重新安排其索引。因此,它需要知道。否則,你會運行一個查詢,它會很快炸燬。
您不應該運行sp_refreshview
來更改視圖。僅用於更改其基礎表。
另外,請不要嘲笑快樂的趣味球。
編輯:只需運行此代碼(連續)嘗試重現您的問題。我是不幸的是,不能,因爲它的工作如預期(SQL Server 2008中):在視圖定義中刪除不需要任何刷新
而且與ALTER VIEW組合
create view MyView
as
select ProductKey, ProductID, ProductName, Price
from dbo.Products
select v.* from MyView v
alter view MyView
as
select ProductKey, ProductID, ProductName, Price*100 as MyPrice
from dbo. Products
select v.* from MyView v
使用WITH SCHEMABINDING,不是設計師
編輯,2012年7月,從上面的鏈接。我大膽
SCHEMABINDING
將視圖綁定到基礎表或表的模式。當指定SCHEMABINDING時,不能以影響視圖定義的方式修改基表或表。視圖定義本身必須首先被修改或刪除,以刪除要修改的表的依賴關係。在使用SCHEMABINDING時,select_statement必須包含引用的表,視圖或用戶定義函數的兩部分名稱(schema.object)。所有引用的對象必須位於同一個數據庫中。
參與使用SCHEMABINDING子句創建的視圖的視圖或表格不能被刪除除非該視圖被刪除或更改,以致它不再具有模式綁定。否則,數據庫引擎會產生錯誤。另外,當這些語句影響視圖定義時,在參與具有模式綁定的視圖的表上執行ALTER TABLE語句失敗。
我猶豫建議。 'WITH SCHEMABINDING' * only *在所有表都在同一臺服務器上的同一個數據庫中時有效。 – Eric 2009-08-13 15:53:57
與模式綁定一起使用將消除對任何刷新的需求,因爲它可以防止更改基礎表。如果您必須更改基礎表,最好的做法是讓您提醒您,隨着您使用模式綁定進行更改,需要隨後更新視圖。 – TimothyAWiseman 2009-08-13 16:02:57
我沒有看到如何防止這種變化等同於消除刷新的需要?除非我誤認爲WITH SCHEMABINDING會阻止更改底層表? – ErikE 2012-07-23 22:04:05
但是,當我有像SELECT b。* FROM b這樣的行爲時也會發生。將列添加到b後,視圖嘗試顯示舊列,即使它們沒有進行硬編碼。 – 2009-08-13 15:55:57
埃裏克的評論依然成立。即使視圖的代碼保持正確,每當底層表的模式發生更改時,都需要刷新視圖的元數據。 – TimothyAWiseman 2009-08-13 16:01:22