由于视图中的数据不会实际存储,所以定义视图时可根据应用的需要,设置一些派生属性列或虚拟列,以便于查询和统计。
以 SELECT * 方式创建的视图可扩充性差,应尽可能避免 。
缺点:修改基表Student的结构后,Student表与F_Student视图的映象关系被破坏,导致该视图不能正确工作。
删除视图DROP VIEW <视图名>;
该语句从数据字典中删除指定的视图定义。如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除 。删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除。
例:删除视图BT_S:
DROP VIEW BT_S; 删除视图IS_S1:拒绝执行
级联删除:DROP VIEW IS_S1 CASCADE;
(2) 查询视图:查询视图与查询基本表相同,视图定义后,就可以像对待基本表一样对视图进行查询(SELECT)操作。
视图消解法(View Resolution)进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义 ;转换成等价的对基本表的查询,把视图定义中的子查询与用户的查询结合起来;执行修正后的查询。
例:在信息系学生的视图中找出年龄小于20岁的学生 SELECT Sno,Sage FROM IS_Student WHERE Sage<20; 视图消解转换后的查询语句为: SELECT Sno,Sage FROM Student
WHERE Sdept= 'IS' AND Sage<20;
例:在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩 SELECT * FROM S_G
WHERE Gavg>=90;
S_G视图的子查询定义:
CREATE VIEW S_G (Sno,Gavg) AS
SELECT Sno,AVG(Grade) FROM SC
GROUP BY Sno; (3) 更新视图
DBMS实现视图更新的方法:转换为对基本表的更新。视图消解法(View Resolution)。 只有对成为“可更新”视图才能进行更新操作。 SQL2对“可更新”视图给出正式定义:从关系R选出某些属性(用select 而不是 select distinct)定义的视图,R本身可以是可更新的视图;Where中不能嵌套涉及R的子查询;Select必须包括足够多的属性,所有not null的属性必须包括。
对于视图元组的更新操作(INSERT、DELETE、UPDATA),有以下三条规则:
如果一个视图是从多个基本表使用联接操作导出的,那么不允许对这个视图执行更新操作。
17
如果在导出视图的过程中,使用了分组和聚集函数操作,也不允许对这个视图执行更新操作。 行列子集视图可以执行更新操作。
在SQL2中,允许更新的视图在定义时,必须加上“WITH CHECK OPTION”短语。DBMS在更新视图时会进行检查,防止用户通过视图对不属于视图范围内的基本表数据进行更新。
例:将信息系学生视图IS_Student中学号200215122的学生姓名改为“刘辰”。 UPDATE IS_Student SET Sname= '刘辰'
WHERE Sno= ' 200215122 '; 转换后的语句: UPDATE Student SET Sname= '刘辰'
WHERE Sno= ' 200215122 ' AND Sdept= 'IS';
例:向信息系学生视图IS_S中插入一个新的学生记录:200215129,赵新,20岁 INSERT
INTO IS_Student
VALUES(‘95029’,‘赵新’,20); 转换为对基本表的更新: INSERT
INTO Student(Sno,Sname,Sage,Sdept) VALUES(‘200215129 ','赵新',20,'IS' );
例:删除信息系学生视图IS_Student中学号为200215129的记录 DELETE
FROM IS_Student
WHERE Sno= ' 200215129 '; 转换为对基本表的更新: DELETE
FROM Student
WHERE Sno= ' 200215129 ' AND Sdept= 'IS'; 更新视图的限制:一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新。对其他类型视图的更新不同系统有不同限制:
(1) 若视图是由两个以上基本表导出的,则此视图不允许更新
(2) 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。
(3) 若视图的字段来自集函数,则此视图不允许更新。
(4) 若视图定义中含有GROUP BY子句,则此视图不允许更新。 (5) 若视图定义中含有DISTINCT短语,则此视图不允许更新。 (6) 若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。
(7) 一个不允许更新的视图上定义的视图也不允许更新 (4) 视图的作用
1. 视图能够简化用户的操作,聚焦于所关心的数据上。 2. 视图使用户能以多种角度看待同一数据,增加灵活性 。 3. 视图对重构数据库提供了一定程度的逻辑独立性。
18
4. 视图能够对机密数据提供安全保护。 5. 适当的利用视图可以更清晰的表达查询。
3、用SQL实现复杂的查询
略
4、什么是基本表?什么是视图?两者的区别和联系是什么?为何要引入视图?
基本表:是独立存在的表。在SQL中,一个关系对应于一个表。
视图:是从一个或多个基本表所导出的表。视图本身并不独立存储在数据库中,是一个虚表,即数据库中之存放视图的定义而不存放其所对应的数据,这些数据仍然存放在导出的视图的基本表中。视图在概念上与基本表等同,用户可以像使用基本表那样使用视图,可以在视图上再定义视图。
为何要引入视图:
1. 视图能够简化用户的操作,聚焦于所关心的数据上。 2. 视图使用户能以多种角度看待同一数据,增加灵活性 。 3. 视图对重构数据库提供了一定程度的逻辑独立性。 4. 视图能够对机密数据提供安全保护。 5. 适当的利用视图可以更清晰的表达查询。
第四章:数据库的安全性
1、什么数据库安全性
数据库的安全性是指保护数据库以防止非法使用所造成的数据泄漏、更改或破坏。
2、数据库安全控制的常用方法和技术
1、用户标识和鉴别:由系统提供一定的方式,让用户表示自己的名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后系统才能提供使用权。
2、存取控制:通过用户权限定义和合法权限检查确保只有拥有合法权限的用户才能访问数据库,所有未授权人员均无法存取数据。
3、视图机制:为不同的用户定义视图,通过视图机制把要保密的数据对无权限用户隐藏起来,从而自动地对数据提供一定程度的安全保护。
4、审计:建立审计日志,把用户对数据库的所有操作自动记录下来并放入审计日志中。DBA可以利用审计跟踪信息来重现导致数据库现状的一系列事件,找出非法存取数据的人、时间和内容等。
5、数据加密:对所存储和传输的数据进行加密处理,从而使得不掌握解密算法的人无法获知数据。
3、什么是数据库中的自主存取控制方法和强制存取控制方法?为什么强制存取控制提供了更高级别的安全性?
自主存取控制方法:定义各个用户对不同数据对象的存取权限。当用户要访问数据库时,首先要检查其存取权限,以防止非法用户对数据库进行存取。
“自主存取控制”中“自主”的含义:用户可以将自己所拥有的存取权限“自主”地授予他人,即用户具有一定的“自主”权。
强制存取控制方法:每一个数据对象被(强制地)标以一定的加密级别,每位用户也被
19
(强制地)授予某一级别的许可证。系统规定只有具有某一许可证级别的用户才能存取加密级别的数据对象。
强制存取控制(MAC)是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提高了更高级别的安全性。
4、自主存取控制语句:授权与收回语句。
GRANT 语句和 REVOKE 语句实现。 关系数据库系统中存取控制权限:
1、GRANT(授权)
GRANT语句的一般格式:
GRANT <权限>[,<权限>]...
ON <对象类型> <对象名> ,[<对象类型> <对象名>] TO <用户>[,<用户>]...
[WITH GRANT OPTION];
将对指定操作对象的指定操作权限授予指定的用户
发出GRANT:DBA,数据库对象创建者(即属主Owner),拥有该权限的用户接受权限的用户 :一个或多个具体用户;PUBLIC(全体用户)。 例:把查询Student表权限授给用户U1 GRANT SELECT
ON TABLE Student TO U1;
例:把查询Student表和修改学生学号的权限授给用户U4 GRANT UPDATE(Sno), SELECT ON TABLE Student TO U4;
对属性列的授权时必须明确指出相应属性列名
2、REVOKE:授予的权限可以由DBA或其他授权者用REVOKE语句收回 REVOKE语句的一般格式为:
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名> >[,<对象类型> <对象名>] … FROM <用户>[,<用户>]... >[CASCADE|RESTRICT];
20