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