『database-3』secruity control
数据库保护
一、数据库安全性控制
安全性含义:防止不合法使用导致的数据泄露、更改或破坏
- 向授权用户提供可靠服务
- 拒绝对数据的非授权访问请求
数据库系统的安全性模型:

用户标识与鉴别:系统最外层的安全保护措施
标识:系统采取一定方式标识其用户或应用程序的名字或身份
认证:用户或应用程序登录时判断是否为合法的授权用户
注意:标识常使用“用户名”,认证常使用“口令”
存取控制:合法用户可以访问、非法用户不能访问
用户权限定义:将用户权限记录定义在数据字典中,形成安全性规则或授权规则
合法权限检查:根据数据字典中的安全规则,对用户的操作请求进行合法权限检查,决定是否接受用户请求
自主存取控制(DAC):用户可以将拥有的权限转授给其他用户,用户权限包含数据对象和操作类型:
- 数据对象:分为 模式 (三级模式)+ 数据(表 + 属性列)
- 操作类型:包括 建立 + 修改 + 检索(模式)、检索 + 插入 + 删除 + 修改(数据)
注意:对用户的授权应包括 用户名 + 数据对象名 + 允许的操作类型
- 角色:一组相关权限的集合,分配权限 \(\Leftrightarrow\) 授予角色
- SQL的数据安全性控制:包括GRANT和REVOKE语句
强制存取控制(MAC):每个用户和数据对象均标记一定的密级
- 主体与客体:主体包括实际用户 + 用户进程;客体包括用户操纵的被动实体(如基本表等)
- 敏感度标记:主体称作许可证级别,客体称作密级
- 对客体的存取规则:
- 许可证级别 \(\ge\) 密级:主体允许读取相应客体(但不能写)
- 许可证级别 = 密级:主体允许改写相应客体
视图机制:为每个用户定义不同的视图,可将对数据的访问限制在一定范围中
审计:将用户对数据库的所有操作自动记录在审计日志,支持DBA重现数据库操作,找出非法记录
数据加密:使用一定的算法将原始数据转变为不可识别的密文
二、数据库完整性控制
完整性内涵:数据的正确性和相容性(数据库对真实世界的表征)
- 正确性:数据类型合法 + 数据处在取值范围内
- 相容性:表示同一事实的两个数据应该相同
注意:安全性防范非法用户or非法操作;完整性防范不合语义的数据
完整性约束条件:施加在数据库上的语义约束条件,作用对象包括 列、元组、关系
- 实体完整性:元组的完整性约束;SQL中使用PRIMARY KEY
- 参照完整性:关系的完整性约束;SQL中使用FOREIGN KEY
- 用户自定义完整性:对列or元组的完整性约束;SQL中使用UNIQUE、NOT NULL、CHECK
静态约束:
- 静态列级约束:对列取值域的说明,如数据类型、取值范围
- 静态元组约束:规定元组中各列间的约束关系
- 静态关系约束:各元组或各关系间的联系与约束,如实体完整性约束、参照完整性约束等
动态约束:
- 动态列级约束:修改列定义or列值时应满足的约束条件
- 动态元组约束:修改元组值时需要满足的约束条件
- 动态关系约束:关系变化前后状态上的限制条件
注意:静态约束反映数据库在确定状态下的约束条件;动态约束反映数据库状态变迁的约束条件
完整性控制的功能实现:
- 定义功能:提供定义完整性约束条件的机制
- 检查功能:检查用户请求是否违背完整性约束条件
- 违约响应:在违背了完整性约束的情况下,采取一定措施保证数据完整性
完整性检查的时机:
- 立即执行约束:在一条语句执行后立即进行完整性约束
- 延迟执行约束:在整个用户事务执行完毕后,再进行完整性约束的检查
完整性规则的表示:五元组 (D, O, A, C, P)
- D(数据):约束作用的数据对象
- O(操作):触发完整性检查的数据操作
- A(断言):数据对象必须满足的断言or语义约束
- C(谓词):若对数据对象施加断言A,则该对象必须满足的谓词条件
- P(过程):违反完整性约束规则时触发的过程
SQL中的完整性约束:
CREATE TABLE 语句:定义列级完整性约束、表级完整性约束
CREATE ASSERTION <断言名> CHECK(约束条件)
触发器:用户对表的更新操作,自动激活相应触发器执行完整性约束(事件驱动)

表名:触发器只能定义在基本表上,不能定义在视图上
触发时机:BEFORE表示在执行触发事件前激活触发器,AFTER则相反
触发事件:可以是 INSERT、UPDATE、DELETE 或其组合,也可以指定操作列名 如 UPDATE OF (若干触发列)
触发器类型:规定触发动作执行的间隔尺寸,对于每条SQL语句
ROW:每操作一个元组,就执行一次触发动作
STATEMENT:执行该SQL语句后,才执行一次触发动作
注意:若没有FOR语句,则可以引用 OLDTABLE(表中原先内容)和 NEWTABLE(表中变化后的部分)
触发条件:WHEN后的语句为真,触发动作才会执行(缺省则触发器激活后立即进行)
触发动作体(匿名SQL块):触发的SQL执行块;若触发动作体执行失败,触发事件也会失效
注意:对于行级触发器,可以使用NEW/OLD引用更新或插入后的新值或更新或删除前的旧值