5 MySQL数据保护
5.1 数据保护
数据安全建立在数据保密性、数据完整性、数据可用性之上
数据库管理系统提供统一的机制保护数据的保密性、完整性、可用性
保密性:
对数据资源的隐藏
指仅允许经授权的读数据
需要对数据值进行保密和数据存在性进行保密
完整性:
数据的可信度
保护数据完整性通常是指防止非法或者未经授权的数据修改
包括数据值,数据来源的完整性
可用性:
对数据库期望使用能力
减少数据库的停工时间,保持数据持续可访问。
软件系统无法保证数据的正确性,但可以保证数据符合可明确定义的约束,称为完整性约束。
数据保护可以通过访问控制、视图、加密、事务、完整性约束等方法实现。
数据库管理系统中的故障恢复机制不仅维护故障情况下的数据完整性,并且由于故障恢复机制对故障的有效处理,它也是保护数据可用性的重要手段。
习题:
定义了完整性约束,就可以保证数据始终真实正确。(错)
5.2 视图
作用:能够简化用户的操作,使用户能够从都中角度看待同一数据,对重构数据库提供了一定程度的逻辑独立性,对数据存在性方面的保密性提供安全保护,适当利用试图可以清晰表达查询。
视图是从若干基本表和其他试图构造出来的“虚表”,采用select语句实现。
在创建一个视图时,只是把其视图的定义存放在数据字典中,而不存储视图对应的数据。视图支持实现数据的逻辑独立性。
在对视图查询时,按视图的定义从基表中将数据查出。
数据库中存储表的模式定义和数据,而只存储视图的定义,不存储视图的数据,数据是查询时临时计算的。
视图和表都是关系,都可在查询中直接使用 ,视图名能够出现在表名可以出现的任何地方。但是数据库存储表的定义和数据,只存储视图的定义,不存储视图的数据。视图中的数据是在使用视图时,按照视图定义中的查询临时计算的。当基表数据发生变化时,相应的视图数据也随之改变。
视图的创建:create view as 子查询(select语句)
撤销:drop view
通过视图,用户只能查询或修改视图中见得到的数据,而看不见数据库的其他数据,也就提供了数据存在性的保护。
视图是可以被展开的,也就是说,可以用视图来定义视图,但是不可以递归定义。
对视图的修改通常是转换为对基表的相应操作来执行。
MySQL只允许对可修改视图进行修改
可修改视图如下:
- 视图时从单个关系只是用投影选择操作导出。
- SELECT子句中只包含属性名,不包含其他表达式、聚集、DISTINCT,GROUP BY,WHERE
- 对视图的修改操作:主键不能为空,插入操作视图的投影列需包含基础关系的键。
在视图定义的末尾包含with check option
,数据库管理系统自动检查视图修改应满足视图定义中WHERE条件,这是插入操作会被拒绝执行。
5.3 访问控制
使用GRANT和REVOKE语句实现授权/收权存入数据库管理系统的数据字典
在角色提出操作请求时,按照授权状态进行检查,从而决定是否执行操作请求。
用户与角色管理
MySQL新增了权限的集合,可以把该集合授权给某个或者某一批用户,在需要给这些用户增减权限的时候,只需要修改角色权限,不需要对每个用户依次进行修改。
授予和撤销角色:GRANT / REVOKE 《角色名》 on exam to / from 《用户名》
(1) 在CREATE ROLE语句完创建了一个ROLE,还需要通过GRANT赋予其相应的权限,在DROP ROLE之后该角色的权限就被取消了。
不能建立循环的成员关系
授予权限
MySQL通过GRANT语句来给角色用户授予数据库操作权限
GRANT 《权限》 ON 《对象类型》 《对象名》 TO 《角色》 【with grant option】
with grant option,指在此语句或的权限的角色可以将所获得权限授予其他角色
授予关于属性列权限时,应当指出相应的属性列名。
CASCADE级联收回,直接收回权限
题目:
PG使用角色来统一管理用户。(对)
5.4 完整性约束
当数据库中任意数据项值发生变化时,DBMS能够判断出数据项的新值是否与现实状态一致。(×)
这时,需要在系统中定义一些约束条件,系统自动检查数据是否满足这些约束条件。
主键
各元组主键不重复,非空
主键声明:CONSTRANIT 《属性名》 PRIMARY KEY
外键
外键值必须来自引用表或为空
违背外键约束称作悬浮元组
外键约束:CONSTRANIT 《属性名》FOREIGN KEY REFERENCES《表名(属性名)》
对引用表操作(插入或更新)违背外键约束时,系统将拒绝执行。
当对被引用表操作(删除或更新)违背了外键约束,采取显示说明的策略,或者拒绝执行。
ON DELETE CASCADE 级联删除
ON UPDATE CASCADE 级联更新
非空
NOT NULL
唯一值
(与主键约束不同:可为空值)约束意味着相应属性为候选键
unique
CHECK约束
CHECK(P)指定一个谓词P,关系中的没一个元组都必须满足谓词P,是一个SQL语句。
例如 check(ersex=‘女’ and eeage < 60)
插入元素时,若新值与约束值相违背,则拒绝更新。若未提到相关属性,则不必检查。
约束类型 | 说明位置 | 检验时刻 |
---|---|---|
属性CHECK约束 | 伴随相应属性一起 | 插入行或者更新相应属性时 |
元组CHECK约束 | 与属性说明并列 | 插入行或者更新元组时 |
题目:
eeexam表的主键由eeid,eid属性组成,此时主键由两个属性一起组成,可以同时在eeid、eid属性声明的后面分别写上PRIMARY KEY就可以了。(错)
单个属性构成的主键(属性约束,元组级约束)
多个属性构成的主键(元组级约束)
将一个表的一个或几个属性定义为候选键后,插入元组或对主键列进行修改操作时,系统自动检查主键的各个属性是否为空,只要有一个为空就拒绝插入或修改;并且检查候选键值是否唯一,如果不唯一则拒绝插入或修改。(错)(候选键可以为空)
5.5 触发器
触发器可以定义在触发事件(insert、delete、update)之前或之后,分为before、after触发器。
按行或者语句触发,即行级触发器(一行执行一次)和语句触发器(一个语句执行一次)。
通常,用行级before触发器检查或修改将要插入或者更新的数据。
用行级的after触发器更新其他表,或者进行一致性检查。
创建只有一条语句的触发器:create trigger 触发器名 before / after 触发事件 on 表名 for each row 执行语句
多条语句:create trigger 触发器名 before / after 触发事件 on 表名 for each row begin 执行语句列表 end
若定义多个触发器,则先激活before触发器,再激活after触发器。
删除触发器:drop trigger 触发器名称。
- 语句级before触发器在触发语句前触发,行级before触发器在对特定行进行操作前触发。
- 行级after触发器在修改由触发器sql语句影响的每一行元组之后触发,语句级after触发器在触发语句结束时触发。
- 行级after触发器的值总是被忽略,可以返回null。
- 行级before触发器的返回值不同,对触发器操作的影响也不同,如果返回NULL则忽略该触发器的行级别操作,其后的触发器也不会被执行,如果非NULL则返回的行将成为被插入或者更新的行。
题目:
行级after触发器在修改由触发SQL语句影响的每一行记录之后触发。(对)
行级after触发器的值总是被忽略,可以返回null;行级before触发器的返回值不同,对触发器操作的影响也不同,如果返回NULL则忽略该触发器的行级别操作,其后的触发器也不会被执行,如果非NULL则返回的行将成为被插入或者更新的行。(对)
触发器函数必须返回一个NULL或者一个元组类型的变量。(对)
5.6 事务
事务:原子性,一致性、隔离性、持久性(ACID)
原子性:事务中的操作,要么都做,要么都不做
一致性:事务如果单独执行,应从一个一致性状态转化为另一个一致性状态。
隔离性:一个事务的执行不会被其他事务干扰
持久性:一个事务一旦被提交,对数据库的改变是持久性的。
mysql中用begin和commit(rollback)来标记事务的始点和终点
题目:
可串行化级别提供最严格的事务隔离,因为事务是一个接着一个串行执行的。(错)
解释:因为可串行化只是让事务看起来像串行,而并非就是串行。
可串行化事务中的语句看到的是该事务开始时的快照。(对)
PG提供三种独立的事务隔离级别,分别是读已提交READ COMMITTED、REPEATABLE READ和可串行化SERIALIZABLE。(对)
5.7 加密
加密:加密算法利用加密密钥将明文转换为密文。
解密:解密算法利用解密密钥将密文还原为明文。
对称加密:加密和解密使用同一密钥。DES,AES
非对称加密:公钥和自己知道的私钥。RSA,DSA
单向加密:对原始数据生成一个较小的位串,成为校验和消息摘要。MD5,SHA
题目:
现代加密体系中算法通常是公开的,密钥是保密的并且需要向可信权威机构申请,安全性完全取决于密钥的保密性。(对)
题目:
PG 使用用户来统一管理角色。(错)角色
数据保密性指的是数据的可信度。(错)对数据资源的隐藏 数据完整性才是指数据的可信度
组角色就是作为组使用的角色,一般不应当具有 LOGIN 属性。(对)
PG 中,默认情况下,新建立的数据库总是包含一个“超级用户”角色,并且默认这个组角色名为postgres。(对)
删除操作不会检验外键约束。(错)不会检验主键约束
语句级触发器应返回 null。(对)
行级 before 触发器在对特定行进行操作之前触发。(对)
如果没有显式 BEGIN 命令,PG 把每个 SQL 语句当做一个事务来看待。(对)
如果一个事务需要连续做若干个命令,而这几个命令必须看到完全相同的数据库视图,隔离级别就需要用读已提交。(错)
解释:读已提交看到的是事务内部当前查询开始时的快照,即一个事务内的所有SELECT语句看到数据不一定相同
现代加密体系中密钥和算法都是保密的,安全性完全取决于它们的保密性。(错)解释:密钥和算法是公开的
唯一值约束意味着相应的属性(或属性组)为候选键。(对)
通常,用行的 after 触发器更新其它表,或进行一致性检查。(对)
通常,用行级 before 触发器检查或修改将要插入或者更新的数据。(对)