2012-02-03 24 views
2

我只是不明白爲什麼SQL Server在從表中刪除列時不會出現錯誤,並且該列由View讀取。據我瞭解,SQL Server擁有這些信息,當你從視圖中選擇查詢時,知道哪些列/表被讀取,所以我認爲它不會讓你刪除一個從視圖引用的列,就像它沒有允許您刪除FK引用的列... 必須對此進行解釋,請別人告訴我! 非常感謝。SQL Server在刪除作爲視圖一部分的字段時沒有提示

回答

4

因爲您必須要求SQL Server執行此跟蹤。該選項被稱爲SCHEMABINDING

將視圖綁定到基礎表的模式。當指定SCHEMABINDING,則基表或表不能的方式會影響視圖定義

同樣選項改性,也可在用戶定義的函數,但不幸的是不能在存儲過程。

這不是默認設置 - 它可以構造解析其表,以供不同用戶的不同基表(假設用戶有不同的默認模式)

+0

始終使用SCHEMABINDING其觀點。使生活更輕鬆(儘管有一些小的開發開銷) – gbn 2012-02-03 08:20:15

+0

非常感謝您的回答,那正是我所期待的。是否可以在默認情況下設置此選項,以便每次我在將來創建視圖時都有SCHEMABINDING ON?我無法在SQL Server Management Studio中找到該選項... – molerus 2012-02-03 08:43:31

+0

@molerus - 如果您使用的是某種設計器,我不確定 - 我手動編寫我的查詢(當然,還有,包括我自己的SCHEMABINDING)。如果使用visual studio模板,我相信它們是可編輯的(同樣,我自己也不使用它們) – 2012-02-03 09:06:56

0

您需要刷新視圖的視圖。下面是刷新數據庫中的所有視圖的腳本:

DECLARE @ViewName AS VARCHAR(255) 
DECLARE @tblErrorViews TABLE(ViewName VARCHAR(255)) 
DECLARE listOfView CURSOR FOR 
    SELECT [Name] FROM sysobjects 
    WHERE xtype = 'V' 
    AND uid = SCHEMA_ID('dbo') 

OPEN listOfView 

FETCH NEXT FROM listOfView into @ViewName 

WHILE (@@FETCH_STATUS <> -1) 
    BEGIN 
     FETCH NEXT FROM listOfView INTO @ViewName 
      print @ViewName 
      EXEC sp_refreshview @ViewName 
    END 

CLOSE listOfView 
DEALLOCATE listOfView 

的你就會知道需要您注意的

+0

這就是如何找出哪些視圖受到更改的影響,而不是防止發生更改影響任何視圖 – 2012-02-03 08:09:38

+0

是的,這是事實。但是如果你知道你已經刪除了一列(我很少這麼做)。然後,您可以運行該腳本,查看是否有任何視圖對該更改產生影響。 – Arion 2012-02-03 08:15:30