2010-04-27 11 views
4

有沒有一種方法可以使SELECT *與底層表保持同步。SQL Server:如果底層表發生更改,則需要重新創建使用SELECT *的視圖

我發現的是,如果對從中選擇所有列的基礎表進行更改,則需要「重新創建」視圖。這可以通過運行ALTER VIEW語句來實現。

但是,這可能會導致一些非常危險的情況。如果您忘記重新創建視圖,它將不會返回正確的數據。事實上,它可能會嚴重返回混亂的數據 - 所有列的名稱都是錯誤的和亂序的。

除非您碰巧遇到了測試或數據完整性檢查失敗,否則沒有任何東西會顯示視圖錯誤。例如,Red Gate SQL Compare沒有提到需要重新創建視圖的事實。

複製的問題,請嘗試以下語句:

CREATE TABLE Foobar (Bar varchar(20)) 

CREATE VIEW v_Foobar AS SELECT * FROM Foobar 

INSERT INTO Foobar (Bar) VALUES ('Hi there') 

SELECT * FROM v_Foobar 

ALTER TABLE Foobar 
ADD Baz varchar(20) 

SELECT * FROM v_Foobar 

DROP VIEW v_Foobar 
DROP TABLE Foobar 

我很想停止使用SELECT *的意見,這將是一個PITA。有沒有設置某處可能可以解決此問題?

+6

不要在視圖中使用SELECT *而是使用明確的列列表。 – 2010-04-27 07:30:40

回答

8

您應該停止使用SELECT *。它總是會導致一些「相當危險」的情況。

但是,作爲替代方案,您可以使視圖模式綁定。這樣,如果不重新創建視圖,您將無法更改基礎表。

+0

就像強制人們放棄觀點並創造觀點的模式概念一樣。 – Thomas 2010-04-27 15:21:31

0

有沒有辦法讓視圖使用SELECT *保持與底層表同步。

當然:更新它們,當你更新基礎表架構:)。嚴重的是,沒有辦法自動更新使用SELECT *的視圖,這是避免它的許多原因之一。更好的方法是顯式枚舉視圖中的列,並且在運行模式更新腳本(它們是腳本化的,以便它們可以進入源代碼控制權限?)時,只需要在視圖中包含更新即可。

相關問題