如视图中所讨论的视图提供在一个或多个表中查看数据的替代方法通过创建视图可以对想要各种用户查看的信息进行限制下列图表显示视图和表之间的关系
图 表和视图之间的关系
在图 中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 语句一样INSERTDELETE 以及 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 的 IDYEARSCOMM 或 BIRTHDATE整个视图中看不到的列被适当地设置为空值或缺省值
然而PERS 表确实已将列 ID 定义为 NOT NULL如果尝试通过 FIXED_INCOME 视图插入行则系统试图将空值插入在整个视图中看不到的所有 PERS 列由于 ID 列未包括在视图中并且该列不允许空值所以系统不允许通过该视图进行插入
有关修改视图的规则和限制参考 SQL Reference 中的 CREATE VIEW 语句