[轉載]SQLServer之檢視簡介

rui1613發表於2018-10-24

SQLServer之檢視簡介

來自https://www.cnblogs.com/vuenote/p/9835190.html

檢視定義

檢視是一個虛擬表,其內容由查詢定義。 同表一樣,檢視包含一系列帶有名稱的列和行資料。 檢視在資料庫中並不是以資料值儲存集形式存在,除非是索引檢視。 行和列資料來自由定義檢視的查詢所引用的表,並且在引用檢視時動態生成。

對其中所引用的基礎表來說,檢視的作用類似於篩選。 定義檢視的篩選可以來自當前或其他資料庫的一個或多個表,或者其他檢視。 分散式查詢也可用於定義使用多個異類源資料的檢視。 例如,如果有多臺不同的伺服器分別儲存您的單位在不同地區的資料,而您需要將這些伺服器上結構相似的資料組合起來,這種方式就很有用。

檢視通常用來集中、簡化和自定義每個使用者對資料庫的不同認識。 檢視可用作安全機制,方法是允許使用者通過檢視訪問資料,而不授予使用者直接訪問檢視基礎表的許可權。 檢視可用於提供向後相容介面來模擬曾經存在但其架構已更改的表。 還可以在向 SQL Server 複製資料和從其中複製資料時使用檢視,以便提高效能並對資料進行分割槽。

檢視型別

除了基本使用者定義檢視的標準角色以外, SQL Server 還提供了下列型別的檢視,這些檢視在資料庫中起著特殊的作用:

索引檢視
索引檢視是被具體化了的檢視。 這意味著已經對檢視定義進行了計算並且生成的資料像表一樣儲存。 可以為檢視建立索引,即對檢視建立一個唯一的聚集索引。 索引檢視可以顯著提高某些型別查詢的效能。 索引檢視尤其適於聚合許多行的查詢。 但它們不太適於經常更新的基本資料集。

分割槽檢視
分割槽檢視在一臺或多臺伺服器間水平連線一組成員表中的分割槽資料。 這樣,資料看上去如同來自於一個表。 聯接同一個 SQL Server 例項中的成員表的檢視是一個本地分割槽檢視。

系統檢視
系統檢視公開目錄後設資料。 您可以使用系統檢視返回與 SQL Server 例項或在該例項中定義的物件有關的資訊。 例如,你可以查詢 sys.databases 目錄檢視以便返回與例項中提供的使用者定義資料庫有關的資訊。 有關詳細資訊,請參閱系統檢視 (Transact-SQL)。

檢視應用場景

可以將檢視用於以下用途:

  • 集中、簡化和自定義每個使用者對資料庫的認識。

  • 用作安全機制,方法是允許使用者通過檢視訪問資料,而不授予使用者直接訪問底層基表的許可權。

  • 提供向後相容介面來模擬架構已更改的表。

  • 為終端使用者減少資料庫呈現的複雜性,客戶端只要對檢視寫簡單的程式碼,就能返回所需要的資料,一些複雜的邏輯操作,放在了檢視中來完成。

  • 對檢視新增一些額外的索引,來提高查詢的效率。
  • 可以合併分離的資料,建立分割槽檢視。

檢視建立注意事項

只能在當前資料庫中建立檢視。 CREATE VIEW 必須是查詢批處理中的第一條語句。 檢視最多可以包含 1024 列。

建立檢視時,有關該檢視的資訊將儲存在下列目錄檢視中:sys.views、sys.columns 和 sys.sql_expression_dependencies。CREATE VIEW 語句的文字將儲存在 sys.sql_modules 目錄檢視中。

建立檢視時, 資料庫引擎將儲存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的設定。 使用檢視時,將使用這些原始設定來分析檢視。 因此,訪問檢視時,SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的任何客戶端會話設定都不會影響檢視定義。

檢視定義中的 SELECT 子句不能包括下列內容:

    • ORDER BY 子句,除非在 SELECT 語句的選擇列表中也有一個 TOP 子句。ORDER BY 子句僅用於確定檢視定義中的 TOP 或 OFFSET 子句返回的行。 ORDER BY 不保證在查詢檢視時得到有序結果,除非在查詢本身中也指定了 ORDER BY。

    • INTO 關鍵字。

    • OPTION 子句。

    • 引用臨時表或表變數:

      因為 select_statement 使用 SELECT 語句,所以按照 FROM 子句的指定,使用 <join_hint> 和 <table_hint> 提示是有效的。有關詳細資訊,請參閱 FROM (Transact-SQL) 和 SELECT (Transact-SQL)。

      UNION 或 UNION ALL 分隔的函式和多個 SELECT 語句可在 select_statement 中使用。

      CHECK OPTION
      要求對該檢視執行的所有資料修改語句都必須符合 select_statement 中所設定的條件。 通過檢視修改行時,WITH CHECK OPTION 可確保提交修改後,仍可通過檢視看到資料。

檢視更新

只要滿足下列條件,即可通過檢視修改基礎基表的資料:

  • 任何修改(包括 UPDATE、INSERT 和 DELETE 語句)都只能引用一個基表的列。

  • 檢視中被修改的列必須直接引用表列中的基礎資料。 不能通過任何其他方式對這些列進行派生,如通過以下方式:

    • 聚合函式:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR 和 VARP。

    • 計算。 不能從使用其他列的表示式中計算該列。 使用集合運算子 UNION、UNION ALL、CROSSJOIN、EXCEPT 和 INTERSECT 形成的列將計入計算結果,且不可更新。

  • 被修改的列不受 GROUP BY、HAVING 或 DISTINCT 子句的影響。

  • TOP 在檢視的 select_statement 中的任何位置都不會與 WITH CHECK OPTION 子句一起使用。

    上述限制應用於檢視的 FROM 子句中的任何子查詢,就像其應用於檢視本身一樣。 通常情況下, 資料庫引擎必須能夠明確跟蹤從檢視定義到一個基表的修改。 有關詳細資訊,請參閱通過檢視修改資料。

如果上述限制妨礙直接通過檢視修改資料,則可以考慮以下選項:

  • INSTEAD OF 觸發器

    可以對檢視建立 INSTEAD OF 觸發器,以使檢視可更新。 將執行 INSTEAD OF 觸發器,而不是執行對其定義了觸發器的資料修改語句。 此觸發器允許使用者指定必須發生以處理資料修改語句的操作集合。 因此,如果存在給定的資料修改語句(INSERT、UPDATE 或 DELETE)的檢視的 INSTEAD OF 觸發器,則可通過該語句更新相應的檢視。 有關 INSTEAD OF 觸發器的詳細資訊,請參閱 DML 觸發器。

  • 分割槽檢視

    如果檢視為分割槽檢視,則可遵循某些限制對其進行更新。 必要時, 資料庫引擎將本地分割槽檢視辨別為所有參與表和檢視都在同一 SQL Server 例項上的檢視,而將分散式分割槽檢視辨別為檢視中至少有一個表駐留在其他或遠端伺服器上的檢視。

檢視優缺點

優點:

1、向檢視新增 SQL 函式、WHERE 以及 JOIN 語句,也可以提交資料,就像這些來自於某個單一的表。

2、資料安全。

3、可以給檢視加密。

4、檢視還可以被巢狀,一個檢視中可以巢狀另一個檢視。

缺點:

1、效能:SQL Server必須把檢視的查詢轉化成對基本表的查詢,如果這個檢視是由一個複雜的多表查詢所定義,那麼,即使是檢視的一個簡單查詢,SQL Server也把它變成一個複雜的結合體,需要花費一定的時間。

2、修改限制:當使用者試圖修改檢視的某些行時,SQL Server必須把它轉化為對基本表的某些行的修改。對於簡單檢視來說,這是很方便的,但是,對於比較複雜的檢視,可能是不可修改的。

3、資料庫表結構的修改可能需要修改相應的檢視,維護和遷移麻煩。

相關文章