数据库系统原理第六章

第六章 数据库安全与保护

**大家想一起学习交流的可以加群,WX:MrCroods。**

DBMS对数据库的安全保护功能是通过完整性约束控制、访问控制、事务与并发控制以及备份与恢复。

第一节 数据库完整性

数据库完整性:数据库中数据的正确性和相容性。
数据库完整性的作用:防止数据库中存在不符合语义的数据,为了维护数据的完整性。
DBMS检查数据是否满足完整性约束条件的机制就称为完整性检查。

一、完整性约束条件的作用对象

完整性约束条件的作用对象:列、元组、表

(1)、列级约束(简单题

1、对数据类型的约束
2、对数据格式的约束
3、对取值范围或取值集合的约束
4、对空值的约束

(2)、元组约束

元组约束是指元组中各个字段之间的相互约束。

(3)、表级约束

表级约束是指元组之间、关系之间的联系的约束。

二、定义与实现完整性约束

关系模型中有三类完整性约束:实体完整性、参照完整性、用户定义的完整性

(1)、实体完整性

实体完整性通过主键约束和候选键约束实现。
1、主键约束
一种作为列的完整性约束,放在所需列之后。
一种作为表的完整性约束,放在所有列属性的最后面。

主键应遵守规则

1)、每一个表只能定义一个主键。
2)、主键的值,也称为键值,必须唯一标志表中的每一行记,且不能为NULL。
3)、复合主键不能包含不必要的多余列。
4)、一个列名在复合主键的列表中只能出现一次。

2、候选键约束

可以定义在某个列上,也可以定义在所有列之后,其值必须唯一,且不能为NULL。

3、二者区别:
1)、一个表中只能创建一个主键,但可以定义若干候选键。
2)、定义主键约束时,系统自动产生PRIMARY KEY索引
3)、定义候选键约束时,系统自动产生UNIQUE索引。

(2)、参照完整性
参照完整性通过创建表或更新表的同时定义一个外键声名来实现的。

第一个种:在表中某个列的属性定义后直接加上“reference_definition”。
第二个种:在表中所有列的属性定义后添加“FOREIGN KEY() REFERENCES… ”

1、外键应遵守规则(简单题

1)、被参照表必须已经用一条CREATE TABLE语句创建。如若是当前正在创建的表,被参照表与参照表是同一表,自参照表,结构称为自参照完整性。
2)、必须为被参照表定义主键。
3)、必须在被参照表的表名后面指定列名或列名的组合。这个列或列名组合必须是被参照表的主键或候选键。
4)、尽管主键是不能包含空值,但允许在外键中出现一个空值。
5)、外键中的列的数目必须和被参照表的主键的列的数目相同。
6)、外键中的列的数据类型必须和被参照表的主键中的对应列的数据类型相同。

2、指定策略
RESTRICT,限制策略,当删除或更新被参照表中被参照列上,并在外键中出现的值时,系统拒绝对被参照表的删除或更新操作。(相似的限制策略:NO ACTION)
CASCADE,级联策略,从被参照表中删除或更新记录行时,自动删除或更新参照表中匹配的记录行。
SET NULL,置空策略,从被参照表中删除或更新记录行时,设置参照表中与之对应的外键列的值为NULL。(外键列没有声明限定词NOT NULL)

(3)、用户定义的完整性
用户定义的完整性约束:非空约束、CHECK约束、触发器

三、命名完整性约束

为了删除或修改完整性约束,首先需要定义约束的同时对其进行命名,使用
CONSTRAINT “约束名”

四、更新完整性约束

(1)、使用ALTER TABLE,注意以下两点:

完整性约束不能直接修改。实际是先删除后添加相同约束名的新约束。
使用ALTER TABLE语句,可独立删除完整性约束。

第二节 触发器

触发器(Trigger)是用户定义在关系表上的一类由事件驱动的数据库对象,也是一种保证数据完整性的方法。
(触发器定义后,任何对表的修改操作均由数据库服务器自动激活相应的触发器)

触发器的作用:实现主键和外键不能保证的复杂的参照完整性和数据一致性,有效保护表中的数据。

一、创建触发器

在创建触发器中,每个表每个事件每次只允许一个触发器。
每个表最多支持6个触发器。单一触发器不能与多个事件或多个表关联。

CREATE TRIGGER MySQL_test.customers_insert_trigger (触发器名称)
AFTER (触发器被触发的时刻)

BEFORE:希望验证新数据是否满足使用的限制。
AFTER:希望在激活触发器的语句执行之后完成几个或更多的改变。

INSERT (触发事件:INSERT、UPDATE、DELETE)
ON MySQL_test.customers (表名)
FOR EACH ROW (每一行都要触发)
@str=‘one customer added!’; (要执行的SQL语句)

二、删除触发器

DROP TRIGGER IF EXISTS MySQL_test.customers_insert_trigger;(触发器名称)

三、使用触发器

(1)、INSERT触发器注意以下几点:

1)、在INSERT触发器中,可引用NEW的虚拟表,来访问被插入的行。
2)、在BEFORE INSERT触发器中,NEW中的值也可以被更新。
3)、对于AUTO_INCREMENT中NEW在INSERT执行之前包含的是0值,在INSERT执行之后将包含新的自动生成值。

(2)、DELETE触发器注意以下几点:

1)、在DELETE触发器中,可引用OLD的虚拟表,来访问被删除的行,可引用NEW的虚拟表,来访问新更新的值。
2)、OLE中的值全部是只读的,不能被更新。

(3)、UPDATE触发器注意以下几点:

1)、在INSERT触发器中,可引用OLD的虚拟表,来访问以前的值。
2)、在BEFORE INSERT触发器中,NEW中的值也可以被更新(只有被UPDATE语句更新的值才能放入NEW表中)。
3)、OLE中的值全部是只读的,不能被更新。
4)、当触发器涉及对触发表自身的更新操作时,只能使用BEFORE INSERT,而AFTER UPDATE触发器不能使用。

第三节 安全性与访问控制

数据库的安全性是指保护数据库以防止不合法的使用而造成数据泄露、更改或破坏。
数据库系统对数据的安全管理是使用身份验证、数据库用户权限确认等访问控制措施,其作用保护数据库中的信息资源,以防止数据遭到破坏

一、用户账号管理

MySQL的用户账号及相关信息都存储在一个名为mysql的数据库中,其中只有一个表——user的数据表。

(1)、创建用户账号
CREATE USER ‘zhangsan’@‘localhost’ (用户名@主机名)
IDENTIFIED BY ‘123’,(IDENTIFIED BY,可选项,指定用户账号对应的口令)
‘lisi’@‘localhost’ IDENTIFIED BY PASSWORD ‘04512638’;(设置口令)

(2)、删除用户账号
DROP USER lisi@localhost;

(3)、修改用户账号
RENAME USER ‘zhangsan’@‘localhost’ TO ‘wangwu’@‘localhost’;

(4)、修改用户口令
SET PASSWORD FOR ‘wangwu’@‘localhost’ = ‘654316346’;

二、账号权限管理

(1)、权限的授予
GRANT
SELECT (权限的名称:SELECT、UPDATE、DELETE)
(cust_id,cust_name)(表中具体的列)
on (用于指定权限授予的对象类型)
MySQL_test.customers(权限的级别,“星号*”全部表,“.*”当前数据库全部表,“.表明”点后的表)
TO(用于设定用户的口令)
‘zhangsan’@‘localhost’;(用户)

(2)、权限的转移
通过GRANT语句中使用WITH子句来实现。如果将WITH子句指定为关键字“WITH GRANT OPTION”,则表示TO子句中所指定的所有用户都具有把自己所拥有的权限授予给其他用户的权利。

(3)、权限的撤销(选择题、填空题

1、不删除用户,只是撤销权限,使用
REVOKE…
REVOKE SELECT
ON MySQL_test.customers
FROM ‘zhangsan’@‘localhost’;
2、收回用户所有权限时,使用
REVOKE ALL PRIVILEGES,GRANT OPTION FORM user

使用REVOKE语句,必须拥有MYSQL数据库的全局CREATE USER 权限或UPDATE权限。

第四节 事务与并发控制

一、事务的概念

事务是用户自定义的一个数据操作序列,可作为完整的工作单元,要么全部执行,要么全部不执行,不可分割。

二、事务的特征

(1)、数据库系统必须保证事务具有四个特征:原子性,一致性,隔离性和持续性,四个特征简称为ACID特征。

1、原子性
事务是不可分割的最小工作单位。
2、一致性
事务必须满足数据库的完整性约束,且事务执行完毕后将数据库由一个一致性状态变到另一个一致性状态。
3、隔离性
要求事务是彼此独立的、隔离的,一个食物的执行不能被其他事务所干扰
4、持续性(也称为永久性)
一个事务一旦提交,其对数据的更改是永久的,其他操作也不会影响执行结果。

三、并发操作问题

(1)、事务是并发控制的基本单位,保证事务的ACID特征是事务处理的重要任务,
并发操作问题,有如下三种

1、丢失更新

两个事务T1、T2,T2提交的结果会破化T1提交的结果。

2、不可重复读

两个事务T1、T2,
T1读取某一数据,T2更新数据,T1在读取数据发现数据不一致。
T1读取某一数据,T2删除数据,T1在读取数据发现数据消失了。
T1读取某一数据,T2插入数据,T1在读取数据发现了两条数据。

3、读脏数据

两个事务T1、T2,T1修改某一数据,T2读取数据,T1被撤销,数据恢复原值,T2在读取数据发现与第一次读取数据不一致。

四、封锁

(1)、封锁基本思想:需要时,事务通过向系统请求对它所希望的数据对象加锁,确保它不被非预期改变。
(2)、封锁的两种类型:排他锁(X锁,对数据插入、删除、修改使用)、共享锁(S锁,读数据使用)。(事务一直占有获得的锁直到结束时释放。)
(3)、通常以粒度来描述封锁的数据单元的大小,DBMS可以决定不同粒度大小的锁,其粒度越细,并发性越大,但软件复杂性和系统开销也大。
(4)、有四种封锁级别

1、0级封锁
2、1级封锁
被封锁的事务不允许重写未提交的更新数据,防止丢失更新发生。
3、2级封锁
被封锁的事务不重写也不读未提交的更新数据,1级封锁效果还防止读脏数据。
4、3级封锁
被封锁的事务不读未提交的更新数据,也不写任何未提交的数据,也不写未提交的读数据。防止不可重读的问题,也保证多个事务并发执行的”可串行化“。

(5)、活锁和死锁
活锁:并发事务处理过程中,由于锁会使一事务处于等待状态而调度其他事务处理,因而该事务可能会因优先级低而永远等待下去。
死锁:两个以上事务循环等待被同组中另一个事务锁住的数据单元的情形。

1、预防死锁的方法:

1)、一次性锁请求:每一事务在处理时一次提出所有的锁请求,仅当这些请求全部满足时事务处理才行,否则让其等待。
2)、锁请求排序:将每个数据单元标以线性顺序,然后要求每一事务都按此顺序提出锁请求。
3)、序列化处理:通过应用设计为每一数据单元建立一个”主人“程序,对给定数据单元的所有请求都发送给”主人“,其以单道形式运行。
4)、资源剥夺:每当事务因锁请求不能满足而受阻,强行令两个冲突事务中的一个ROLLBACK,释放所有的锁,以后重新运行。

死锁检测可以用图论的方法实现,并以正在执行的事务为结点。(选择题、填空题)

(6)、可串行性

在数据库系统中,可串行性就是并发执行的正确性准则,即当且仅当一组事务的并发调度是可串行化的,才认为它们是正确的。

(7)、两段封锁法

两段封锁法是一种最简单而有效的保障封锁其调度是可串行的方法。
两段封锁协议中规定:任何一个事务,所有加锁操作必须在所有释放锁操作之前。

(8)、事务划分有以下两个阶段:
发展或加锁阶段;收缩或释放锁阶段

第五节 备份与恢复

数据库备份:通过导出数据或者复制表文件的方式来制作数据的复本。
数据库恢复:当数据库出现故障或遭到破坏时,将备份的数据库加载到系统,从而使数据库从错误状态恢复到备份时的正确状态。
数据库的备份与恢复作用:保证数据库中的数据的可靠性和完整性。

导致运行事物异常中断的因素:计算机硬件故障、计算机软件故障、病毒、人为误操作、自然灾害、盗窃。

(1)、使用SELECT INTO…OUTFILE语句备份数据
(2)、使用LOAP DATA…INSERT语句恢复数据

发布了31 篇原创文章 · 获赞 4 · 访问量 1503

猜你喜欢

转载自blog.csdn.net/qq_38471554/article/details/104375396
今日推荐