如視圖中所討論的
視圖提供在一個或多個表中查看數據的替代方法
通過創建視圖
可以對想要各種用戶查看的信息進行限制
下列圖表顯示視圖和表之間的關系
圖
表和視圖之間的關系
在圖
中
View_A 被限制僅存取 TABLE_A 的列 AC
和 AC
View_AB 允許存取 TABLE_A 中的列 AC
和 TABLE_B 中的列 BC
通過創建 View_A
將用戶可以具有的存取權限制於 TABLE_A
通過創建 VIEW_AB
將存取權限制於某些列並創建查看數據的替代方式
下列語句創建 STAFF 表 中
部門的非經理人員視圖
其中薪水和傭金不通過基表顯示
CREATE VIEW STAFF_ONLY
AS SELECT ID
NAME
DEPT
JOB
YEARS
FROM STAFF
WHERE JOB <>
Mgr
AND DEPT=
在創建視圖之後
下列語句顯示視圖的內容
SELECT *
FROM STAFF_ONLY
此語句產生下列結果
早些時候
我們把 STAFF 和 ORG 表連接起來產生一個列出每個部門名稱及其部門經理姓名的結果
下列語句創建可重復用於相同目的的視圖
CREATE VIEW DEPARTMENT_MGRS
AS SELECT NAME
DEPTNAME
FROM STAFF
ORG
WHERE MANAGER = ID
創建視圖時
可以使用 WITH CHECK OPTION 子句將附加約束添加到通過視圖插入和更新表
此子句導致數據庫管理程序驗證對視圖的任何更新或插入是否符合該視圖的定義
並拒絕那些不符合定義的更新或插入
如果省略此子句
則不檢查違反視圖定義的插入和更新
有關 WITH CHECK OPTION 如何起作用的詳情
參考 SQL Reference 中的 CREATE VIEW 語句
使用視圖來處理數據
象 SELECT 語句一樣
INSERT
DELETE 以及 UPDATE 語句可以應用於視圖
就好象視圖是一個實表一樣
這些語句處理基本基表中的數據
因此當再次存取該視圖時
使用最新的基表對它進行計算
如果未使用 WITH CHECK OPTION
則使用視圖修改的數據可能由於不再滿足原始視圖定義而不在視圖的重復存取中出現
下列是一個將更新應用於視圖 FIXED_INCOME 的示例
FIXED_INCOME 的視圖定義
CREATE VIEW FIXED_INCOME (LNAME
DEPART
JOBTITLE
NEWSALARY)
AS SELECT NAME
DEPT
JOB
SALARY
FROM PERS
WHERE JOB <>
Sales
WITH CHECK OPTION
UPDATE FIXED_INCOME
SET NEWSALARY =
WHERE LNAME =
Li
除了校驗選項以外
先前視圖中的更新等效於對基表 PERS 的更新
UPDATE PERS
SET SALARY = SALARY *
WHERE NAME =
Li
AND JOB <>
Sales
注意
由於視圖是在 CREATE VIEW FIXED_INCOME 中對約束 JOB <>
Sales
使用 WITH CHECK OPTION 創建的
所以當 Limoges 調去做銷售時不允許下列更新
UPDATE FIXED_INCOME
SET JOBTITLE =
Sales
WHERE LNAME =
Limoges
不能更新由表達式 SALARY + COMM or SALARY *
定義的列
如果定義的視圖包含一列或多個這樣的列
則擁有者不接受對這些列的更新(UPDATE)特權
在包含這樣的列的視圖上不允許 INSERT 語句
但允許 DELETE 語句
考慮一個沒有一列定義為 NOT NULL 的 PERS 表
可以通過 FIXED_INCOME 視圖將行插入 PERS 表中
即使該視圖不包含基本表 PERS 的 ID
YEARS
COMM 或 BIRTHDATE
整個視圖中看不到的列被適當地設置為空值或缺省值
然而
PERS 表確實已將列 ID 定義為 NOT NULL
如果嘗試通過 FIXED_INCOME 視圖插入行
則系統試圖將空值插入在整個視圖中
看不到
的所有 PERS 列
由於 ID 列未包括在視圖中並且該列不允許空值
所以系統不允許通過該視圖進行插入
有關修改視圖的規則和限制
參考 SQL Reference 中的 CREATE VIEW 語句
From:http://tw.wingwit.com/Article/program/SQLServer/201311/21967.html