天天看點

SQL Server基礎知識之:設計和實作視圖

設計和實作視圖可謂是資料庫實體設計中的一個非常重要的步驟。從一般意義上說,設計和實作視圖應該遵循下面的一些建議和原則。

以下内容摘在文檔,我對某些重點進行了補充說明(紅色部分)

  • 隻能在目前資料庫中建立視圖。 但是,如果使用分布式查詢定義視圖,則新視圖所引用的表和視圖可以存在于其他資料庫甚至其他伺服器中。
  • 分布式視圖是可行的,但随着SQL Server本身能力的提高,例如SQL Server 2005開始支援表分區等技術之後,分布式視圖應該盡量少用。
  • 所謂分布式視圖的一個最大的問題就是将表實體上分開在多個資料庫甚至伺服器中,這增加了維護和查詢的難度
  • 視圖名稱必須遵循辨別符的規則,且對每個架構都必須唯一。 此外,該名稱不得與該架構包含的任何表的名稱相同。
  • 一個可以借鑒的做法是:在視圖名稱之前添加一個字首 vw
  • 您可以對其他視圖建立視圖。Microsoft SQL Server 允許嵌套視圖。但嵌套不得超過 32 層。 根據視圖的複雜性及可用記憶體,視圖嵌套的實際限制可能低于該值。
  • 一般不建議超過2層
  • 不能将規則或 DEFAULT 定義與視圖相關聯。
  • 不能将 AFTER 觸發器與視圖相關聯,隻有 INSTEAD OF 觸發器可以與之相關聯。
  • 除非萬不得已,一般不建議使用觸發器
  • 定義視圖的查詢不能包含 COMPUTE 子句、COMPUTE BY 子句或 INTO 關鍵字。
  • 很多朋友不知道:COMPUTER和COMPUTER BY語句僅僅用于一些特殊場合,用于生成總計行。大緻有如下的效果

該特性不能用于視圖,但可以直接用于查詢

  • 定義視圖的查詢不能包含 ORDER BY 子句,除非在 SELECT 語句的選擇清單中還有一個 TOP 子句。
  • 這個很有意思,如果要通路所有的呢,還必須是寫TOP 100 PERCENT
  • 定義視圖的查詢不能包含指定查詢提示的 OPTION 子句。
  • 定義視圖的查詢不能包含 TABLESAMPLE 子句。
  • 關于TABLESAMPLE語句,大家可能也比較陌生,這是一個用于對資料進行抽樣的。它和TOP語句不同,TOP語句是有固定大小的,而TABLESAMPLE傳回的資料,可能多,可能少,甚至可能沒有
  • 我之前有一篇文章講述這個文法
  • 不能為視圖定義全文索引定義。
  • 不能建立臨時視圖,也不能對臨時表建立視圖。
  • 在SQL Server 2005中,可以通過CTE(Common Table Expression)來實作該功能
  • 之前的版本,大緻的做法是使用臨時表,表變量,函數等等
  • 不能删除參與到使用 SCHEMABINDING 子句建立的視圖中的視圖、表或函數,除非該視圖已被删除或更改而不再具有架構綁定。 另外,如果對參與具有架構綁定的視圖的表執行 ALTER TABLE 語句,而這些語句又會影響該視圖的定義,則這些語句将會失敗。
  • 如果未使用 SCHEMABINDING 子句建立視圖,則對視圖下影響視圖定義的對象進行更改時,應運作 ​sp_refreshview​。 否則,當查詢視圖時,可能會生成意外結果。
  • 如果你修改了一個表,那麼如何重新整理所有與該表有關的視圖呢
  • 強烈建議對某些非常重要的視圖,添加SCHEMABINDING 子句。
  • 盡管查詢引用一個已配置全文索引的表時,視圖定義可以包含全文查詢,仍然不能對視圖執行全文查詢。
  • 下列情況下必須指定視圖中每列的名稱:
  • 視圖中的任何列都是從算術表達式、内置函數或常量派生而來。
  • 視圖中有兩列或多列原應具有相同名稱(通常由于視圖定義包含聯接,是以來自兩個或多個不同表的列具有相同的名稱)。
  • 希望為視圖中的列指定一個與其源列不同的名稱。 (也可以在視圖中重命名列。) 無論重命名與否,視圖列都會繼承其源列的資料類型。 若要建立視圖,您必須擷取由資料庫所有者授予的此操作執行權限,如果使用 SCHEMABINDING 子句建立視圖,則必須對視圖定義中引用的任何表或視圖具有相應的權限。

    預設情況下,由于行通過視圖進行添加或更新,當其不再符合定義視圖的查詢的條件時,它們即從視圖範圍中消失。 例如,建立一個定義視圖的查詢,該視圖從表中檢索員工的薪水低于 $30,000 的所有行。如果員工的薪水漲到 $32,000,因其薪水不符合視圖所設條件,查詢時視圖不再顯示該特定員工。 但是,WITH CHECK OPTION 子句強制所有資料修改語句均根據視圖執行,以符合定義視圖的 SELECT 語句中所設條件。 如果使用該子句,則對行的修改不能導緻行從視圖中消失。 任何可能導緻行消失的修改都會被取消,并顯示錯誤。