SQL Server視圖操作原理透析
為什么使用視圖
視圖是一個便利的方法,它只給用戶對一個表的部分訪問權限。視圖可以限制將返回的記錄以及可用的字段。所以授權用戶對這個視圖的訪問權限而不是這個表本身來限制他們的訪問權限。視圖還是一個用于隱藏復雜語句和只顯示給終端用戶一個簡單的單一表結果集的便利方法。
創建一個視圖
SQL Server視圖可以使用TSQL語句來創建或通過SQL Server Management Studio圖形化地創建。對于第一個例子,我們將使用Management Studio和Adventure Works數據庫(Adventure Works是Microsoft提供的一個免費測試數據庫)。要開始,啟動Management Studio,擴展開Databases,擴展開Adventure Works然后右鍵單擊Views,選擇New View。這將打開Add Table對話框。對于這個例子,我們將選擇Person.Contact表。點擊Add然后Close。這將出現如下所示的圖形設計器。
圖1
四個不同的面板組成了這個界面。上端的面板是Designer(設計器),在它之中可以選擇表和字段。第二個面板,Criteria(標準),可以用來過濾和排序。第三個面板,SQL,展示由我們的圖形化選擇所創建的TSQL語句。最后一個面板,Results(結果),將顯示這個語句返回的數據。
在第一個例子中,我們將創建一個所有聯系人中第一個名字含有Don的電話列表。在Designer面板中選擇First Name, Last Name和Phone Number字段。Criteria和SQL面板將根據所做選擇自動生成。在Criteria面板中,在First Name行中的過濾字段中輸入“=Don”。要執行和測試這個語句,點擊紅色注釋勾選圖標。這個語句將看起來如下面的圖片所示。
圖2
這個語句可以在上面三個面板中的任意一個中進行編輯。例如,在SQL面板中,改變WHERE語句為執行一個LIKE并重新執行。這將返回133行記錄
- SELECT TOP (100) PERCENT FirstName, LastName, Phone
- FROM Person.Contact
- WHERE (FirstName LIKE 'Do%')
當這個語句完成時,點擊上面菜單條中的保存標簽,一個Chose Name for a View對話框將打開。輸入名稱TestView,然后點擊OK。刷新視圖列表,然后新的SQL Server視圖就出現了。右鍵單擊新的視圖將出現一個對話框,類似于一個表對話框,如下所示。
圖3
使用TSQL命令創建一個視圖是非常直接的。它的語法很簡單:
- CREATE VIEW view_name
- AS
- Select_statement
所以第一個例子就是:
- CREATE VIEW TestView
- AS
- SELECT TOP (100) PERCENT FirstName, LastName, Phone
- FROM Person.Contact
- WHERE (FirstName LIKE 'Do%')
在創建一個SQL Server視圖時,在SELECT中使用的大多數普通命令都可以使用,例如JOINS和Aliases。這意味著我們使用了一個非常麻煩的語句,將它保存為一個視圖,然后只使用它所返回的更簡單的表,從而隱藏原來語句的復雜性。在創建視圖時有一些命令不能使用。關鍵字INTO不能像任何對臨時表的參照一樣使用。此外,ORDER BY不能使用。(在從GUI創建視圖時,它將讓你指定一個ORDER BY,但是它不會被保存。)所有的Ordering都需要在視圖之外的SELECT語句中完成。
從視圖中SELECT
右鍵單擊新的視圖并選擇“SELECT top 1000 rows”。下面的語句將被創建,它的結果將被返回。
- /****** Script for SelectTopNRows command from SSMS ******/
- SELECT TOP 1000 [FirstName]
- ,[LastName]
- ,[Phone]
- FROM [AdventureWorks].[dbo].[TestView]
注意看下從一個視圖獲得選擇結果的語法和從一個表選擇項目的語句是多么一致。這是使用視圖的一個好處。所有的常用表命令例如GROUP BY和ORDER BY在從一個視圖進行選擇時都可用。例如,下一個語句是典型的GROUP和COUNT,不過是基于新創建的視圖而不是一個表。
SELECT FirstName, COUNT(FirstName) as NbrOfNames
- FROM TestView
- GROUP BY FirstName
- ORDER BY FirstName
圖4
從視圖UPDATE就像我們可以更新一個表中的數據一樣,視圖也可以被更新。基于上一個例子,這個語句可以被修改為一個UPDATE,如下所示:
- UPDATE TestView
- SET FirstName = 'Test'
- WHERE FirstName = 'Douglas' AND LastName = 'Baldwin'
只要原來的創建視圖的語句沒有使用分組命令例如GROUP BY或Distinct,那么這個視圖就是可更新的。此外,獲取的字段,例如那些使用函數AVG和SUM創建的字段是不能使用的。
要使用Management Studio從一個視圖進行更新,在Object Explorer中右鍵單擊這個視圖并選擇“Edit Top 200 Rows”。這將打開一個可編輯的網格,就像使用表時一樣。
圖5
總結
使用SQL Server的好處包括限制用戶訪問底層數據的權限,以及隱藏復雜語句以便可以使用簡單的結果集。創建SQL Server視圖的語法很簡單,而且幾乎所有的常用TSQL命令都可用。如果數據要通過一個視圖更新或刪除,那么在創建這個視圖時不能使用聚合和分組語句。
【編輯推薦】