DB-04 安全性与完整性
DB-04 数据库安全性与完整性
一、数据库安全性
1.1 安全性控制模型
数据库安全性控制贯穿数据访问的各个环节:
事前控制:用户标识和鉴别(输入用户名密码)、入侵检测
事中控制:存取控制(判断用户是否有权限访问数据)
事后控制:审计(记录用户的操作日志,用于事后追溯)
存储保护:敏感数据加密存储
传输保护:数据在网络传输过程中的加密
1.2 存取控制
数据库存取控制分为两种类型:
自主存取控制(DAC):用户可以根据自己的意愿,将自己拥有的数据对象的访问权限授予其他用户。这是最常用的方式,通过SQL的GRANT和REVOKE语句实现。
强制存取控制(MAC):系统根据主体和客体的安全级别进行控制。每个用户被分配一个"许可证级别",每个数据对象被分配一个"密级"。只有当用户的安全级别大于等于数据的密级时,才能访问该数据。
1.3 课堂例题解析
例题:某数据库中有数据表Info,用户分为两类:管理员(admin)和访客(guest)。为每一位用户单独配置权限繁琐且易出错,请提出最优的权限管理方案。
解答:可以使用数据库角色机制。先创建admin和guest两个角色,为每个角色授予适当的权限,然后将用户分配到对应的角色中。这样当权限需要更新时,只需修改角色的权限,所有属于该角色的用户都会自动继承更新。
CREATE ROLE admin; CREATE ROLE guest; GRANT ALL PRIVILEGES ON Info TO admin; GRANT SELECT ON Info TO guest; GRANT admin TO user_admin1, user_admin2; GRANT guest TO user_guest1, user_guest2;
二、数据库完整性
2.1 完整性约束定义
数据库完整性是指数据的正确性和相容性。例如:"年龄必须是整数,且取值在14-29之间"是正确的,"性别必须是男或女"是相容的。
完整性约束的完整定义方式:
CREATE TABLE SC (
SNO CHAR(9),
CNO CHAR(4),
GRADE SMALLINT,
CONSTRAINT PK_SC PRIMARY KEY (SNO, CNO),
CONSTRAINT FK_SNO FOREIGN KEY (SNO) REFERENCES Student(SNO),
CONSTRAINT FK_CNO FOREIGN KEY (CNO) REFERENCES Course(CNO),
CONSTRAINT CK_GRADE CHECK (GRADE >= 0 AND GRADE <= 100)
);
2.2 触发器
触发器是一种特殊的存储过程,它由DML事件(INSERT、UPDATE、DELETE)自动触发。触发器可以实现更复杂的完整性约束,如:
- 当更新学生年龄时,检查新年龄是否在合理范围内
- 当删除系别时,级联删除该系所有学生的选课记录
- 记录每次对重要数据的修改操作到审计日志
CREATE TRIGGER check_stu_age
BEFORE INSERT ON Student
FOR EACH ROW
BEGIN
IF NEW.Sage < 14 OR NEW.Sage > 29 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '年龄必须在14-29之间';
END IF;
END;