通常,DBMS对数据库的安全保护是通过完整性控制,安全性控制,并发控制和数据库的备份与恢复来实现的。
第一节 数据库完整性
数据库完整性,是指数据库中信息的正确性和相容性。
数据完整性约束是为了防止数据库中存在不符合语义的数据。
加在数据库之上的语义约束条件就是数据完整性约束
1.完整性约束条件的作用对象
(1)列级约束
列级约束主要是指对列的取值范围,类型,精度等进行约束。
(2)元组约束
元组约束指各个字段之间的相互约束
(3)表级约束
表级之间的约束指若干关系之间的约束
2.定义与实现完整性约束
2.1 实体完整性
(1)主键约束
主键可以是表中的某一列,也可以是多个列的组合。多列组成的主键称之为复合主键。
(1.1)每一个表中只能定义一个主键。
(1.2)主键的值必须能够唯一标识表中的一列数据,且不能NULL.
(1.3)复合主键中不能包含不必要的列
(1.4)定义主键,使用 primary key 关键字
(1.5)候选键约束使用 unique 关键字
主键与候选键的区别:主键只能有一个,候选键则可以有若干个。
2.2 参照完整性
参照完整性是通过外键声明来实现的。
2.3 用户定义的完整性
(1)非空约束 not null
(2)check 约束
2.4 命名完整性
2.5 更新完整性
第二节 触发器
触发器是用户定义在关系表上的一类由事件驱动的数据库对象。也是一种保证数据完整性的方法。
触发器与表的关系十分密切,其主要作用是实现主键和外键不能保证的复杂的参照完整性和数据一致性。从而有效的保护表中的数据。
1.创建触发器
MySQL中使用 create trigger 语句创建触发器
语法 : create trigger t_name trigger_time trigger_event on tb_name for each row t_body
t_name 表示触发器名称
trigger_time 表示触发器被触发的时间,它的值有两个选项 before 和 after
trigger_event 表示指定触发事件,可以是 insert update 或delete ,表示在指定状态时触发
tb_name 表示与触发器相关联的表
for each row 用于指定对于受触发事件影响的每一行都要激活触发器的动作
t_body 表示触发器的主体,多条语句使用begin end结构
-- 创建触发器
-- 创建一个触发器,在插入一条数据的时候,为变量names赋值
create trigger check_student before insert
on student
for each row
set @names='good!';
insert student(name,sex,address,class)values('JackMa',1,'北京市',2)
select @names
2.删除触发器
删除触发器与删除表的操作相似
drop trigger [ if exists ] trigger_name
drop trigger check_student -- 删除触发器
需要注意的是,删除一个表时,与表相关联的触发器会被一起删除。
且触发器不能被修改,如果需要修改只能先删除后再创建。
3.使用触发器
触发器分为3种,分别是insert触发器,update触发器和delete触发器
(1)Insert触发器
在insert触发器中,可引用一个名为 New 的虚拟表,来访问被插入的行。
在 befor insert中,可以修改被插入数据行的值
对于自增列,befor insert 中总是0,after insert 则是新生成的值
例:创建一个insert 触发器,用于获取插入行的值
-- 创建触发器
create trigger check_student before insert
on student
for each row
set @name_new=NEW.name; -- 将被插入数据的 name 属性值赋值给变量
insert student(name,sex,address,class)values('JackMa',1,'北京市',2)
select @name_new
(2)delete 触发器
delete触发器可在数据被删除前或删除后执行
在delete触发器中可以引用名为 OLD 的虚拟表来访问被删除的数据
delete触发器中被删除对象的值无法修改
(3)update 触发器
update 触发器可以在数据被更新前或更新后使用
使用 虚拟表 OLD 获取更新前的数据
使用 虚拟表 NEW 获取更新后的数据
第三节 安全性与访问控制
数据库的安全性是指保护数据库以防止不合法的使用而造成数据泄露,更改或破坏。
MySQL中,数据库系统对数据的安全管理是使用者身份验证和数据库用户权限等访问限制,来保护数据库中的数据。
1 . 账号管理
MySQL中的用户信息全部被存在一个叫MySQL的数据库中
查看所有数据库用户
select * from mysql.user;
第四节 事务与并发控制
1.事务的概念
所谓事务是指用户定义的一个数据操作序列,这些序列是一个完整的工作单元,要么全部执行,要么全部不执行。
2.事务的特征
为了保证数据的一致性和正确性,数据库系统必须保证事务具有四个特征,即原子性,一致性,隔离性和持续性。这四个即是事务的ACID特征。
(1)原子性
事务的原子性保证事务包含的一组更新操作是原子不可分割的,即事务是不可分割的最小工作单位。所包含的这些操作是一个整体。
(2)一致性
一致性要求事务必须满足数据库的完整性约束,且事务执行完毕后将数据库由一个一致性状态转变到另一个一致性状态。
(3)隔离性
隔离性要求事务是彼此独立的。即一个事务的执行不能被其他事务所干扰
(4)持续性
持续性也成永久性。是指一个事务一旦执行,它对数据库中的改变应该是永久性的。
3.并发操作问题
事务是并发控制的基本单位,保证事务的ACID特征是事务处理的重要任务。而事务的ACID特征可能遭到破坏的原因之一是多个事务对数据库的并发操作造成的。
并发操作的三种典型问题
(1)丢失更新
(2)不可重复读
(3)读“脏”数据
产生上述问题的主要原因是破坏了事务的隔离性。
解决并发操作带来的数据不一致性问题的方法,常用的有封锁,时间戳,乐观控制法和多版本并发控制。
4.封锁
封锁是最常见的并发控制技术。即事务通过向系统中请求对它所希望的数据对象加锁。以确保它不会被预期更改。
(1)锁
一个锁实质就是允许或阻止一个事务对一个数据对象的存取特权。
确切的控制由封锁的类型决定。基本的封锁类型有两种,排它锁(X锁),共享锁(S锁),一般的,写操作要求X锁,读操作要求S锁
(2)利用封锁进行并发控制
(2.1)若一个事务对指定数据加了X锁,则其他所有事务都必须等待,直到这个事务释放锁
(2.2)若一个事务对数据加了S锁,则其他事务依旧可以对数据请求S锁,而对数据的X锁请求必须等到这个事务释放
(2.3)事务执行数据库操作时都要先请求相应的锁,即对读操作请求S锁,对增删改请求X锁。
(2.4)事务一直占有获得的锁直到结束时释放
(3)封锁的粒度
通常以粒度来描述封锁的数据单元的大小。
粒度越细,并发性就越大,但软件复杂性和系统开销也就越大。
(4)封锁的级别
封锁的级别又称之为一致性级别或隔离度,与封锁的期限有关。
由各种锁的类型和封锁期限组合可形成不同的封锁级别。
(4.1)0级封锁
封锁的事务不重写其他非0级封锁事务的未提交的更新数据。
(4.2)1级封锁
被封锁的事务不允许重写未提交的更新数据,这防止了丢失更新的发生
(4.3)2级封锁
被封锁的事务既不重写也不读取未提交的更新数据,这防止了丢失更新和读脏数据的发生
(4.4)3级封锁
被封锁的事务不读未提交的更新数据,不写任何未提交的数据,防止了丢失更新和读脏数据的发生和不可重读的问题。
(5)活锁与死锁
(5.1)在并发事务处理过程中,由于锁会使一个事务处于等待状态而调度其他事务处理,因而该事务可能会因为优先级低而永远等待下去,这种现象称之为活锁。解决活锁最简单的办法是“先来先服务”
(5.2)两个以上事务循环等待被同组中另一个事务锁住的数据单元的情形,称之为死锁。
解决死锁的常用办法:
一次性锁请求,锁清秋序列,序列化处理,资源剥夺
(6)可串行性
一组事务的一个调度就是它们基本操作的一种排序。
若在一个调度中,对于任意两个事务T1和T2,要么T1的所有操作都在T2之前执行,要么都在之后执行,则该调度是串行的,因而是正确的。
若一个调度等价于某一串行调度,即它所产生的结果与某一串行调度的结果一样,则说调度是可串行化的。
在数据库系统中,可串行性就是并发执行的正确性准则,即当且仅当一组事务的并发执行调度是可串行化的,才认为他们是正确的。
(7)两段封锁法
封锁是一种并发控制技术,而可串行性是并发控制的正确性标准。
采用 两段封锁法 是一种最简单而有效的保障封锁其调度是可串行性的方法。
两段封锁法是事务遵循两段锁协议的调度方法。
两段锁协议规定,在任何一个事务中,所有加锁操作都必须在所有释放锁操作之前。
事务划分两个阶段:发展或加锁阶段,收缩或释放阶段
定理:遵循两段锁协议的事务的任何并发调度都是可串行化的。
第五节 备份与恢复
数据库备份是指通过导出数据或复制表文件的方式来制作数据库的副本。
数据库恢复是以备份为基础的,它是与备份相对应的系统维护和管理操作。
1.使用 select info … outfile语句备份数据
语法格式:select * into outfile ‘file_name’ export_options | into dumpfile ‘file_name’
SHOW VARIABLES LIKE "secure_file_priv" -- 当VARIABLES 的value不为空时,则只能将备份文件放置在该目录下
SELECT * from student into outfile 'C:\\ProgramData\\MySQL\\MySQL Server 5.6\\Uploads\\123.txt'
2.使用 load data … infile 恢复数据