設計和實現視圖可謂是資料庫實體設計中的一個非常重要的步驟。從一般意義上說,設計和實現視圖應該遵循下面的一些建議和原則。
以下內容摘在文檔,我對某些重點進行了補充說明(紅色部分)
只能在當前資料庫中建立視圖。 但是,如果使用分散式查詢定義視圖,則新視圖所引用的表和視圖可以存在於其他資料庫甚至其他伺服器中。
- 分布式視圖是可行的,但隨著SQL Server本身能力的提高,例如SQL Server 2005開始支援表分區等技術之後,分布式視圖應該盡量少用。
- 所謂分布式視圖的一個最大的問題就是將表物理上分開在多個資料庫甚至伺服器中,這增加了維護和查詢的難度
視圖名稱必須遵循標識符的規則,且對每個架構都必須唯一。 此外,該名稱不得與該架構包含的任何錶的名稱相同。
- 一個可以借鑒的做法是:在視圖名稱之前添加一個首碼 vw
您可以對其他視圖建立視圖。Microsoft SQL Server 允許嵌套視圖。但嵌套不得超過 32 層。 根據視圖的複雜性及可用記憶體,視圖嵌套的實際限制可能低於該值。
不能將規則或 DEFAULT 定義與視圖相關聯。
不能將 AFTER 觸發器與視圖相關聯,只有 INSTEAD OF 觸發器可以與之相關聯。
定義視圖的查詢不能包含 COMPUTE 子句、COMPUTE BY 子句或 INTO 關鍵字。
- 很多朋友不知道:COMPUTER和COMPUTER BY語句僅僅用於一些特殊場合,用於產生合計列。大致有如下的效果
該特性不能用於視圖,但可以直接用於查詢
定義視圖的查詢不能包含 ORDER BY 子句,除非在 SELECT 語句的挑選清單中還有一個 TOP 子句。
- 這個很有意思,如果要訪問所有的呢,還必須是寫TOP 100 PERCENT
定義視圖的查詢不能包含指定查詢提示的 OPTION 子句。
定義視圖的查詢不能包含 TABLESAMPLE 子句。
- 關於TABLESAMPLE語句,大家可能也比較陌生,這是一個用於對資料進行抽樣的。它和TOP語句不同,TOP語句是有固定大小的,而TABLESAMPLE返回的資料,可能多,可能少,甚至可能沒有
- 我之前有一篇文章講述這個文法 http://www.cnblogs.com/chenxizhang/archive/2009/05/19/1460040.html
不能為視圖定義全文索引定義。
不能建立臨時視圖,也不能對暫存資料表建立視圖。
- 在SQL Server 2005中,可以通過CTE(Common Table Expression)來實現該功能
- 之前的版本,大致的做法是使用暫存資料表,表變數,函數等等
不能刪除參與到使用 SCHEMABINDING 子句建立的視圖中的視圖、表或函數,除非該視圖已被刪除或更改而不再具有架構綁定。 另外,如果對參與具有架構綁定的視圖的表執行 ALTER TABLE 語句,而這些語句又會影響該視圖的定義,則這些語句將會失敗。
- 如果未使用 SCHEMABINDING 子句建立視圖,則對視圖下影響視圖定義的對象變更時,應運行 sp_refreshview。 否則,當查詢檢視時,可能會產生意外結果。
- 如果你修改了一個表,那麼如何重新整理所有與該表有關的視圖呢
- http://msdn.microsoft.com/zh-cn/library/ms187821(SQL.90).aspx
- 強烈建議對某些非常重要的視圖,添加SCHEMABINDING 子句。
儘管查詢引用一個已配置全文索引的表時,視圖定義可以包含全文檢索查詢,仍然不能對視圖執行全文檢索查詢。
下列情況下必須指定視圖中每列的名稱:
- 視圖中的任何列都是從算術運算式、內建函數或常量派生而來。
- 視圖中有兩列或多列原應具有相同名稱(通常由於視圖定義包含聯結,因此來自兩個或多個不同表的列具有相同的名稱)。
- 希望為視圖中的列指定一個與其源列不同的名稱。 (也可以在視圖中重新命名列。) 無論重新命名與否,視圖列都會繼承其源列的資料類型。
若要建立視圖,您必須擷取由資料庫擁有者授予的此操作執行許可權,如果使用 SCHEMABINDING 子句建立視圖,則必須對視圖定義中引用的任何錶或視圖具有相應的許可權。
預設情況下,由於行通過視圖進行添加或更新,當其不再符合定義視圖的查詢的條件時,它們即從視圖範圍中消失。 例如,建立一個定義視圖的查詢,該視圖從表中檢索員工的薪水低於 $30,000 的所有行。如果員工的薪水漲到 $32,000,因其薪水不符合視圖所設條件,查詢時視圖不再顯示該特定員工。 但是,WITH CHECK OPTION 子句強制所有資料修改語句均根據視圖執行,以符合定義視圖的 SELECT 語句中所設條件。 如果使用該子句,則對行的修改不能導致行從視圖中消失。 任何可能導致行消失的修改都會被取消,並顯示錯誤。
本文由作者:陳希章 於 2009/6/15 17:31:29 發布在:http://www.cnblogs.com/chenxizhang/
本文著作權歸作者所有,可以轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。
更多部落格文章,以及作者對於部落格引用方面的完整聲明以及合作方面的政策,請參考以下網站:陳希章的部落格中心