SQL Server 視圖

  視圖實際上就是一個存儲查詢,重點是是可以混合和匹配來自基本表(或者其他視圖)的數據,從而創建在很多方面像另一個基表那樣起作用的對象。可以創建一個簡單的查詢,僅僅從一個表中選擇幾列,而忽略其他列;或者也可以創建一個複雜的查詢,連接幾個表,使的這些表看起來像一個表。

一、簡單的視圖

  視圖的語法如下:

CREATE VIEW <view name>
AS
<SELECT statement>

  具體語法:

CREATE VIEW [schema_name].<view name> [(<column name list>)]
[WITH [ENCRYPTION][,SCHEMABINDING][,VIEW_METADATA]]
<SELECT statement>
WITH CHECK OPTION

  示例:

CREATE VIEW columnNamePath_vw
AS
SELECT col_name,col_path 
From Nx_column

  這種形式的視圖可以達到的目的是,向特定的用戶屏蔽一部分列信息,只顯示他需要的列,對於敏感的列屏蔽。

  還有一種就是作爲過濾的視圖,通過使用where子句,達到屏蔽一部分行的信息,只顯示他需要的行,對於敏感的行屏蔽。

二、複雜點的視圖

  複雜點的視圖,其實也複雜不到哪裏去,無非是添加一些inner join,left join之類的東西而已。

  此外,還可以通過使用各種函數實現,只返回某一天的數據,或格式經過整理的數據等等。

  視圖與的工作方式與表很像,但是還是有一些不同之處。在對視圖執行INSERT,UPDATE以及DELETE語句時,要記住以下一些內容

  •   如果視圖包含連接,在大多數情況下,除非使用INSTEAD OF觸發器,否則不能對數據執行INSERT或DELETE操作。有時(只要只更新來自單個表的列),UPDATE可以  不使用INSTEAD OF觸發器來工作,但是這需要一些規劃,否則很快會遇到問題。
  •   如果視圖僅僅引用單個表,那麼在表中的所有必需字段都在視圖中或者有默認值的情況下,可以通過使用視圖而不用INSTEAD OF觸發器來對數據執行INSERT操作。幾時對於單個表的視圖來說,如果有一列沒有出現在不具有默認值的視圖中,那麼如果想要允許INSERT操作,必須使用INSTEAD OF觸發器。
  •   可在有限範圍內限制是否可以在視圖中插入或更新內容。

  1、用連接的數據處理視圖變化

  如果視圖有多個表,那麼在很多情況下使用視圖來修改數據是不允許的-除非使用INSEEAD OF觸發器。

  2、必需字段必須在視圖中出現或者具有默認值

  在默認情況下,如果使用視圖來插入數據(內部查詢必定有一個單個表的SELECT操作或者至少必須限制插入隻影響到一個表,並且使所有必需的列出現),那麼必須能爲所有的必需字段(不允許爲空的字段)提供一些值。不過要認識到任何沒有數據以及不接受NULL數值的列需要出現在視圖中。以通過視圖來執行INSERT操作。

  3、通過WITH CHECK OPTION限制插入到視圖中的內容

  WITH CHECK OPTION是SQL Server中鮮爲人知的功能之一。規則很簡單-爲了通過使用視圖更新或者插入數據,結果行必須符合要求以顯示在視圖結果中。

   示例:

CREATE VIEW PortlandAreaAddress_vw
AS
SELECT AddressId,AddressLine1,City,StateProviceID,PostalCode,ModifiedDate
FROM Person.Address
WHERE PostalCode LIKE '970%' OR PostalCode LIKE '971%' OR PostalCode LIKE '972%' OR PostalCode LIKE '986[6-9]%'
WITH CHECK OPTION

  如果嘗試通過對以上視圖來更新一行,將PostalCode設置爲不是以97或98開頭:

  UPDATE PortlandAreaAddress_vw
  SET PostalCode = '33333'  --不以97 98 開頭
  WHERE AddressID = 22

  SQL Server會報錯

  視圖進行的插入或更新已失敗,原因是目標視圖或目標視圖所跨越的某一視圖指定了WITH CHECK OPTION,而該操作的一個或多個結果行又不符合CHECK OPTION約束。

  語句已經終止。

  WHERE子句過濾視圖的內容,以便只顯示970、971、972或9866~9869之間的郵編,並且WITH CHECK OPTION說明任何INSERT或者UPDATE語句必須滿足WHERE之間的條件(而33333這個郵編不滿足這個條件)。

  以上語句如果用表執行是正常的。

三、使用T-SQL編輯視圖

  在使用T-SQL編輯視圖時要記住,這是在完全替換現有的視圖。使用ALTER VIEW語句和CREATE VIEW語句的區別主要有以下幾點:

  •   ALTER VIEW期望找到一個已有的視圖,而CREATE則不是。
  •   ALTER VIEW保留了視圖上已經建立的任何權限。
  •   ALTER VIEW保留了任何依賴信息。

   要切記第二點,如果刪除了視圖,然後在CREATE,那麼其效果與ALTER VIEW語句基本一樣,只是權限信息要全部重建。

  刪除視圖的語法如下:

DROP VIEW <view name>,[<view name>,[...n]]

 四、審查:顯示現有代碼

  有兩種得到實際視圖定義的方法:

  •   sp_helptext
  •   sys.modules元數據函數

  sp_helptext示例:

EXEC sp_helptext PortlandAreaAddress_vw

  SQL Server返回創建視圖的代碼

   sys.modules示例:

  使用該函數的主要問題在於所有對象都用對象ID編碼,對象ID是SQL Server跟蹤事物的內部方法,他們是整型值而不是用於對象的名稱。可以通過使用OBJECT_ID()函數來避開這個問題。

  SELECT * 
  FROM sys.sql_modules
  WHERE  object_id = OBJECT_ID('dbo.PortlandAreaAddress_vw')

  再次得到SQL Server創建視圖的代碼,和sp_helptext一樣。

五、保護代碼:加密視圖

  加密視圖所有必須做的是使用WITH ENCRYPTION選項。技巧:

  •   WITH ENCRYPTION跟在視圖名稱之後,但在AS關鍵字之前。
  •   WITH ENCRYPTION不使用OPTION關鍵字

  如果使用ALTER VIEW語句,那麼意味着除了訪問權限外,完全替換了現有的視圖。那麼意味着加密方法也被替換了。如果想對被改變的視圖加密,那麼必須在ALTER VIEW語句中使用WITH ENCRYPTION子句。  

   示例:

  ALTER VIEW CustomerOrders_vw
  WITH ENCRYPTION
  AS
  SELECT.....

  現在再對以上視圖查看信息:

  EXEC sp_helptext CustomerOrders_vw

  SQL Server提示如下:

  對象'CustomerOrders_vw'的文本已加密。

  注意:在使用WITH ENCRYPTION之前,必須先備份好源代碼,一旦源代碼被加密,就沒有辦法恢復。如果沒有在其他地方存儲代碼,又需要改變代碼只有重新編寫。

六、模式綁定

  模式綁定實際上就是將視圖所依賴的事物(表或者其他視圖)“綁定”到視圖。起重要意義在於除非首先刪除模式綁定的視圖,否則沒有人可以修改那些對象(CREATE、ALTER)。

  其作用如下:

  •   可以防止修改底層對象時使用視圖"孤立"。如刪除了表,但沒考慮到視圖。
  •   爲了允許創建索引視圖:如果想要在視圖上創建索引,那麼必須使用SCHEMABINDING選項來創建視圖。
  •   如果要創建一個模式綁定的用戶自定義函數來引用視圖,那麼視圖也必須是綁定的。

  視圖注意事項總結:

  •   避免基於視圖構建視圖-而應該將來自第一個視圖的合適的查詢信息應用到新的視圖中。
  •   記住使用WITH CHECK OPTION的視圖提供了一些普通CHECK約束所不具備的靈活性
  •   如果不希望其他人能看見你的源代碼,就加密視圖,但要記得備份未加密的代碼;因爲加密後就不能恢復爲加密的代碼了。
  •   除了權限之外,使用ALTER VIEW意味着完全替換了現有的視圖。這意味着如果要使被修改的視圖裏的加密和限制仍然是有效的,那麼必須在ALTER語句裏包含WITH ENCRYPTION和WITH CHECK OPTION子句。
  •   使用sel_helptext顯示視圖支持的代碼-避免使用系統表。
  •   最小化用於生產查詢的視圖的用戶-因爲他們增加了額外的系統開銷並且危害性能。

  視圖一般用於以下情況:

  •   過濾行
  •   保護敏感數據
  •   降低數據庫複雜性
  •   將多個物理數據庫抽象爲一個邏輯數據庫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章