一 数据控制知识框架
二 安全性
- 目的:防止恶意破坏、非法的存取。
1 计算机安全性概述
- 三类安全性问题:
- 技术安全
- 管理安全
- 政策法律
- 安全标准简介:
用户 - DBMS - OS - DB(用户标识、鉴别 - 数据库安全保护 - 操作系统安全保护 - 数据密码存储)。
信息安全标准:
两个有名的 TCSEC 和 CC 标准。
2 数据库安全性控制
数据库安全性控制常用方法:
用户身份鉴别,存取控制(自主存取控制、强制存取控制),视图,审计,数据加密。存取控制(自主存取控制、强制存取控制):
- 自主存取控制:对用户或角色授权一些操作,数据本身无密级。
- 强制存取控制:DBMS 管理的实体分为主体(许可证级别)、客体(密级)。对其分别设置敏感度标记。
敏感度标记:
规则:
高层级能读低层级的;低层级能写高层级的。
(1)用户身份鉴别
只有系统管理员才有权限创建一个新数据库用户。1
2CREATE USER <用户名>
[WITH DBA|RESOURCE|CONNECT];
DBA:可创建用户,模式,基本表,视图,可授予其他用户一些权限。
RESOURCE:可创建基本表和视图,可授予其他用户一些权限。
CONNECT:为默认。只能登陆数据库,查询和操作需相应权限。
(1)补充:数据库角色
角色是一组用户的集合。通过给角色授权,再将角色授给用户,简化给用户授权过程。
创建角色:
CREATE ROLE <角色>
将角色授给其他角色或用户:
1
2
3GRANT <角色>,...
TO <角色|用户>,...
[WITH ADMIN OPTION] /*此用户或角色可将权限授给其他角色或用户*/角色权限的回收:
1
2
3REVOKE <权限>,...
ON <对象类型><对象名>,...
FROM <角色>,...
(2)存取控制(授权与收回)
- 授权:
存取控制(自主存取控制):必须防止不经根节点 DBA 的循环授权。
可以使用 GRANT 语句的三种:DBA、数据库对象创建者、拥有该权限的用户。
1
2
3
4
5
6
7
8
9GRANT <权限>,...
ON <对象类型><对象名>,...
TO <用户>,...
[WITH GRANT OPTION] /*有此选项可传播权限*/
例:
GRANT UPDATE(sno),SELECT
ON TABLE student
TO u4; /*所有用户可用 public*/补充,权限:
insert、delete、update、select、references(允许创建关系时声明外键)、all privileges(授予所有权限)。
- 权限回收:
1
2
3REVOKE <权限>,...
ON <对象类型><对象名>,...
FROM <用户>,... [CASCADE|RESTRICT]
3 视图机制
略(见之前的博文)。
4 审计
概念:
把用户对数据库的所有操作记录下来放入审计日志。/审计可分为用户级审计(任何用户可设置)、系统级审计(DBA 可设置)。/ 可用触发器实现审计跟踪、数据库内置机制创建审计跟踪。审计与取消审计:
1
2
3
4
5
6
7审计:AUDIT
AUDIT ALTER,UPDATE
ON SC; // SC 为表。
取消审计:NOAUDIT
NOAUDIT ALTER,UPDATE
ON SC;
5 数据加密
- 替换法:用密钥将原文转换为不可识别的密文。
- 置换法:将明文按不同顺序重新排列。
6 统计数据库安全性
统计数据库允许用户查询聚集类型的信息(如合计、平均值),但不允许查询单个记录信息。
三 完整性
- 目的:防止数据库中存在不正确的数据。
- 方法:提供定义完整性约束条件的机制;完整性检查的方法;违约处理。
1 实体完整性
- 实体完整性的定义:
- 在创建表中用 PRIMARY KEY 定义。对于主码的约束。
- 对于单属性构成的码,可定义为列级约束条件、表级约束条件。
- 对于多个属性构成的码,定义为表级约束条件。
1 | // 定义为列级 |
- 实体完整性的检查、违约处理:
- DBMS 会对操作进行检查,扫描全表或通过建立的索引检查。
2 参照完整性
- 参照完整性的定义:
- 在创建表中用 FOREIGN KEY、REFERENCES 定义。对于外码的约束。
- 一个参照完整性把两个表中相应的元素联系起来了。
- 对于参照完整性。除了定义外码,还应该定义外码列是否允许为空值。当违反参照表、被参照表完整性,采用默认操作(拒绝)。
1 | CREATE TABLE Student( |
- 参照完整性的检查、违约处理:
- 拒绝:NO ACTION
- 级联:CASCADE
- 设置为空值
1 | CREATE TABLE Student( |
3 用户定义完整性
(1)属性
- 属性上的约束条件定义:
- 在创建表中定义。
- 不允许取空值:NOT NULL
- 列值唯一:UNIQUE
- 检查列是否是满足一个布尔表达式:CHECK
1
2
3
4...
Ssex CHAR(2) CHECK (Ssex IN ('男','女'))
Grade SMALLINT CHECK (Grade >= 0 AND Grade <= 100)
...
- 属性上的约束条件检查、违约处理:
插入元组、修改属性值时,DBMS 会检查约束条件是否被满足。
(2)元组
- 元组上的约束条件定义:
- 与属性上约束类似。元组级的限制可以设置不同属性间的取值的相互约束条件。
- 在创建表中:
1
2
3
4...
CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
/* 定义了元组中两个属性间的约束条件。性别为女同通过,性别为男时,名字不能以 MS. 开头。 */
...
- 元组上的约束条件检查、违约处理:
插入元组、修改属性值时,DBMS 会检查约束条件是否被满足。
4 完整性约束命名子句
- 完整性约束命名子句的定义:
- 在创建表时,用 CONSTRAINT 语句灵活的增加、删除一个完整性约束条件。
- 定义方法(表级、列级):
CONSTRAINT <完整性约束条件名> [PRIMARY KEY 短语 | FOREIGN KEY 短语 | CHECK 短语]
- 修改表中的完整性限制:
删除原来的、添加新的约束条件1
2
3
4
5ALTER TABLE Student
DROP CONSTRAINT C1;
ALTER TABLE Student
ADD CONSTRAINT C1 CHECK (Sno BETWEEN 1000 AND 9999);
5 触发器
- 定义触发器:
- 表的拥有者可创建一定数量的触发器。
- 触发器名:同一模式下,触发器名必须是唯一的。
- 触发事件:触发事件可以是某个事件 UPDATE、INSERT、DELETE;几个事件的组合 INSERT OR DELETE 等。UPDATE OF <触发列,…> 表示指明修改哪些列时触发器激活。
- 触发器类型:触发动作的间隔尺寸,行级(每行执行一次)、语句级(多行动作后只执行一次)。
- 触发条件:当条件为真才触发,省略 WHEN 则在触发器激活后立即执行触发动作体。
- 触发动作体:一个 PL/SQL 过程块,或已存储过程的调用。
1
2
3
4
5CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]
<触发动作体>
- 激活触发器:
同一个表多个触发器执行顺序:
- 执行该表上的 BEFORE 触发器(一般按时间、名称顺序等)。
- 激活触发器 SQL 语句。
- 执行该表上的 AFTER 触发器(一般按时间、名称顺序等)。
- 删除触发器:
1
DROP TRIGGER <触发器名> ON <表名>