数据库的保护功能主要包括确保数据的安全性、完整性、并发控制和数据库恢复等方面的内容。
一、数据库安全性
数据库的安全性是指保护数据库,以防止不合法的使用造成的数据泄密、更改或破坏。(防范对象是非法用户和非法操作)
数据库安全性控制的一般方法:
1、用户标识与鉴别(输入用户名、回答口令、回答对随机数的运算结果)
2、存取控制
自主存取控制(GRANT 和 REVOKE):DAC,用户对于不同的对象有不同的存取权限;不同用户对同一对象也可能有不同的存取权限;用户可以自主决定谁可以访问这些资源以及访问的权限级别。这种控制方式灵活性较高。
强制存取控制 :MAC,每个数据对象都被标以一定的密级,而每个用户也有自己的安全级别和相应的许可权。在这种模型下,只有当用户的许可级别不低于所请求数据对象的安全级别时,该用户才被允许访问该对象。是一种更为严格的访问控制策略。
3、视图机制:通过视图可以控制用户对数据的访问权限,仅向用户提供他们有权查看的数据,保护敏感信息不被未授权访问。
4、审计:审计系统会跟踪并记录所有对数据库的访问尝试。
5、数据加密:是防止数据库中的数据在存储和传输中失密的有效手段。根据一定的算法将明文变为密文。(替换和置换两种方法)
练习
完整性检查和控制的防范对象是 非法操作,防止它们进入数据库。安全性控制的防范对象是未授权的行为,防止他们对数据库存取数据。
在数据库系统中,定义存取权限称为 授权。SQL语言用 GRANT 语句向用户授予对数据的操作权限,用 REVOKE 语句收回授予的权限。
存取控制机制主要包括两部分: (1) 定义用户权限 ,并将用户权限登记到 数据字典中。(2)系统进行权限检查,拒绝用户的非法操作。
数据库角色是指被命名的一组与数据库操作相关的权限。
在存取控制机制中,定义存取权限称为 授权 ,在强制存取控制 (MAC) 中,仅当主体的许可证级别 大于或等于 客体的密级时,该主体才能读取对应的客体; 仅当主体的许可证级别 等于 客体的客级时,该主体才能写相应的客体。
SQL Server 的4层安全防线
① Windows NT 操作系统的安全防线;②SQL Server 的运行安全防线; ③SQL Server 数据库的安全防线; ④SQL Server 数据库对象的安全防线。
二、数据库完整性
数据库的完整性是指数据的正确性和相容性。(防范对象是不合语义的数据)
实体完整性:确定主键的唯一值。
参照完整性:维护参照表中的外码与被参照表中主码的相容关系。
域完整性:为列和列组指定一个有效的数据集,并确定该列是否允许为空。
对于违反实体完整性和域完整性的操作一般都采用拒绝执行的方式处理。而违反参照完整性的操作不是简单的拒绝执行,有时候还要根据于语义执行附加操作。
三、并发控制
对并发执行的事务的控制叫并发控制。——充分利用系统资源,发挥数据共享资源的特点。
1、事务的概念
事务是用户定义的一个数据库操作序列。
事务和程序是两个概念,一般地讲,一个程序中包含多个事务。
2、事务的特性(ACID)
- 原子性(Atomicity):事务是数据库的逻辑工作单位,事务作为一个整体,事务中包含的所有操作要么全做,要么一个也不做。
- 一致性(Consistency):事务完成后,结果必须是数据库从一个一致性状态变到另一个一致性状态。
- 隔离性(Isolation):即使多个事务并发执行,也互不干扰。
- 持久性(Durability):一旦事务提交,其对数据库的影响是永久的。
3、事务特性遭破坏的原因
① 多个事务并行运行时,不同事务的操作交叉执行
② 事务在运行过程中被强行停止
4、并发操作带来的数据不一致性问题(没有保证事务的隔离性而导致)包括三类
- 丢失修改:两个事务同时更新同一数据,其中一个事务的更新结果被另一个事务覆盖。
- 不可重复读:在一个事务内,多次读取同一数据时得到不同的结果,因为其他事务对该数据进行了修改。
- 读“脏”数据:事务一修改某数据后写入物理数据库,但因某种原因修改操作被撤销,数据恢复原值,这时候,事务二读取的数据就与数据库中的数据不一致,事务二读到的数据叫脏数据,就是不正确的数据。
5、解决上面不一致性问题——封锁
封锁是一种并发控制策略,用于防止多个事务同时访问同一数据资源而引发的不一致性。
三个环节
①申请加锁:事务在操作前对将要使用的数据提出加锁要求;
②获得锁:条件成熟时候,系统允许事务对数据枷锁,获得对数据的控制权;
③释放锁:完成操作后事务放弃数据的控制权。
封锁类型
排它锁(X锁) 允许事务读取修改数据,阻止其他事务获取任何类型的锁(包括读取和写入)。
共享锁(S锁) 允许事务读取数据,阻止其他事务对该数据加排它锁,但其他事务能加共享锁。
两段锁协议(2PL)——保证并发调度可串行性
事务分为两个阶段:加锁阶段和解锁阶段。在事务开始时获取所有需要的锁,并在事务结束时释放所有锁。