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;