数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL入门:创建视图


发布日期:2023年02月10日
 
SQL入门:创建视图

如视图中所讨论的视图提供在一个或多个表中查看数据的替代方法通过创建视图可以对想要各种用户查看的信息进行限制下列图表显示视图和表之间的关系

表和视图之间的关系

在图 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 语句

上一篇:SQL Server2000数据库置疑的解决方法

下一篇:SQL入门:除去重复行