《数据库系统概论》笔记七:MySQL 安全性与完整性

作者 Marlous 日期 2018-09-17
《数据库系统概论》笔记七:MySQL 安全性与完整性

一 数据控制知识框架

数据控制知识框架

二 安全性

  • 目的:防止恶意破坏、非法的存取。

1 计算机安全性概述

  1. 三类安全性问题:
  • 技术安全
  • 管理安全
  • 政策法律
  1. 安全标准简介:
  • 用户 - DBMS - OS - DB(用户标识、鉴别 - 数据库安全保护 - 操作系统安全保护 - 数据密码存储)。

  • 信息安全标准:
    两个有名的 TCSEC 和 CC 标准。
    TCSEC/TDI
    CC

2 数据库安全性控制

  1. 数据库安全性控制常用方法:
    用户身份鉴别,存取控制(自主存取控制、强制存取控制),视图,审计,数据加密。
    数据库安全性控制模型

  2. 存取控制(自主存取控制、强制存取控制):

  • 自主存取控制:对用户或角色授权一些操作,数据本身无密级。
  • 强制存取控制:DBMS 管理的实体分为主体(许可证级别)、客体(密级)。对其分别设置敏感度标记。
    敏感度标记:
    强制存取控制敏感度标记
    规则:
    高层级能读低层级的;低层级能写高层级的。
    强制存取控制规则 1
    强制存取控制规则 2

(1)用户身份鉴别

只有系统管理员才有权限创建一个新数据库用户。

1
2
CREATE USER <用户名>
[WITH DBA|RESOURCE|CONNECT];

DBA:可创建用户,模式,基本表,视图,可授予其他用户一些权限。
RESOURCE:可创建基本表和视图,可授予其他用户一些权限。
CONNECT:为默认。只能登陆数据库,查询和操作需相应权限。

(1)补充:数据库角色

角色是一组用户的集合。通过给角色授权,再将角色授给用户,简化给用户授权过程。

  1. 创建角色:
    CREATE ROLE <角色>

  2. 将角色授给其他角色或用户:

    1
    2
    3
    GRANT <角色>,...
    TO <角色|用户>,...
    [WITH ADMIN OPTION] /*此用户或角色可将权限授给其他角色或用户*/
  3. 角色权限的回收:

    1
    2
    3
    REVOKE <权限>,...
    ON <对象类型><对象名>,...
    FROM <角色>,...

(2)存取控制(授权与收回)

  1. 授权:
  • 存取控制(自主存取控制):必须防止不经根节点 DBA 的循环授权。
    存取控制(自主存取控制)

  • 可以使用 GRANT 语句的三种:DBA、数据库对象创建者、拥有该权限的用户。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    GRANT <权限>,...
    ON <对象类型><对象名>,...
    TO <用户>,...
    [WITH GRANT OPTION] /*有此选项可传播权限*/

    例:
    GRANT UPDATE(sno),SELECT
    ON TABLE student
    TO u4; /*所有用户可用 public*/
  • 补充,权限:
    insert、delete、update、select、references(允许创建关系时声明外键)、all privileges(授予所有权限)。

  1. 权限回收:
    1
    2
    3
    REVOKE <权限>,...
    ON <对象类型><对象名>,...
    FROM <用户>,... [CASCADE|RESTRICT]

3 视图机制

略(见之前的博文)。

4 审计

  1. 概念:
    把用户对数据库的所有操作记录下来放入审计日志。/审计可分为用户级审计(任何用户可设置)、系统级审计(DBA 可设置)。/ 可用触发器实现审计跟踪、数据库内置机制创建审计跟踪。

  2. 审计与取消审计:

    1
    2
    3
    4
    5
    6
    7
    审计:AUDIT
    AUDIT ALTER,UPDATE
    ON SC; // SC 为表。

    取消审计:NOAUDIT
    NOAUDIT ALTER,UPDATE
    ON SC;

5 数据加密

  • 替换法:用密钥将原文转换为不可识别的密文。
  • 置换法:将明文按不同顺序重新排列。

6 统计数据库安全性

统计数据库允许用户查询聚集类型的信息(如合计、平均值),但不允许查询单个记录信息。

三 完整性

  • 目的:防止数据库中存在不正确的数据。
  • 方法:提供定义完整性约束条件的机制;完整性检查的方法;违约处理。

1 实体完整性

  1. 实体完整性的定义:
  • 在创建表中用 PRIMARY KEY 定义。对于主码的约束。
  • 对于单属性构成的码,可定义为列级约束条件、表级约束条件。
  • 对于多个属性构成的码,定义为表级约束条件。
1
2
3
4
5
6
7
8
9
10
11
12
// 定义为列级
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY,
Ssex CHAR(2)
);

// 定义为表级
CREATE TABLE Student(
Sno CHAR(9),
Ssex CHAR(2),
PRIMARY KEY (Sno,Ssex)
);
  1. 实体完整性的检查、违约处理:
  • DBMS 会对操作进行检查,扫描全表或通过建立的索引检查。

2 参照完整性

  1. 参照完整性的定义:
  • 在创建表中用 FOREIGN KEY、REFERENCES 定义。对于外码的约束。
  • 一个参照完整性把两个表中相应的元素联系起来了。
  • 对于参照完整性。除了定义外码,还应该定义外码列是否允许为空值。当违反参照表、被参照表完整性,采用默认操作(拒绝)。
1
2
3
4
5
6
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY,
Con CHAR(5) NOT NULL,
Ssex CHAR(2),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);
  1. 参照完整性的检查、违约处理:
  • 拒绝:NO ACTION
  • 级联:CASCADE
  • 设置为空值
1
2
3
4
5
6
7
8
9
10
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY,
Con CHAR(5) NOT NULL,
Cid CHAR(20),
Ssex CHAR(2),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE CASCADE, /* 删除 Course 表元组的时候,级联删除本表中对应的。 */
FOREIGN KEY (Cid) REFERENCES Course(Cid)
ON DELETE NO ACTION /* 删除 Course 表元组的时候造成与本表中对应的元组不一致时,拒绝删除。 */
);

3 用户定义完整性

(1)属性

  1. 属性上的约束条件定义:
  • 在创建表中定义。
  • 不允许取空值:NOT NULL
  • 列值唯一:UNIQUE
  • 检查列是否是满足一个布尔表达式:CHECK
    1
    2
    3
    4
    ...
    Ssex CHAR(2) CHECK (Ssex IN ('男','女'))
    Grade SMALLINT CHECK (Grade >= 0 AND Grade <= 100)
    ...
  1. 属性上的约束条件检查、违约处理:
    插入元组、修改属性值时,DBMS 会检查约束条件是否被满足。

(2)元组

  1. 元组上的约束条件定义:
  • 与属性上约束类似。元组级的限制可以设置不同属性间的取值的相互约束条件。
  • 在创建表中:
    1
    2
    3
    4
    ...
    CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
    /* 定义了元组中两个属性间的约束条件。性别为女同通过,性别为男时,名字不能以 MS. 开头。 */
    ...
  1. 元组上的约束条件检查、违约处理:
    插入元组、修改属性值时,DBMS 会检查约束条件是否被满足。

4 完整性约束命名子句

  1. 完整性约束命名子句的定义:
  • 在创建表时,用 CONSTRAINT 语句灵活的增加、删除一个完整性约束条件。
  • 定义方法(表级、列级):CONSTRAINT <完整性约束条件名> [PRIMARY KEY 短语 | FOREIGN KEY 短语 | CHECK 短语]
  1. 修改表中的完整性限制:
    删除原来的、添加新的约束条件
    1
    2
    3
    4
    5
    ALTER TABLE Student
    DROP CONSTRAINT C1;

    ALTER TABLE Student
    ADD CONSTRAINT C1 CHECK (Sno BETWEEN 1000 AND 9999);

5 触发器

  1. 定义触发器:
  • 表的拥有者可创建一定数量的触发器。
  • 触发器名:同一模式下,触发器名必须是唯一的。
  • 触发事件:触发事件可以是某个事件 UPDATE、INSERT、DELETE;几个事件的组合 INSERT OR DELETE 等。UPDATE OF <触发列,…> 表示指明修改哪些列时触发器激活。
  • 触发器类型:触发动作的间隔尺寸,行级(每行执行一次)、语句级(多行动作后只执行一次)。
  • 触发条件:当条件为真才触发,省略 WHEN 则在触发器激活后立即执行触发动作体。
  • 触发动作体:一个 PL/SQL 过程块,或已存储过程的调用。
    1
    2
    3
    4
    5
    CREATE TRIGGER <触发器名>
    {BEFORE | AFTER} <触发事件> ON <表名>
    FOR EACH {ROW | STATEMENT}
    [WHEN <触发条件>]
    <触发动作体>

触发器

  1. 激活触发器:
    同一个表多个触发器执行顺序:
  • 执行该表上的 BEFORE 触发器(一般按时间、名称顺序等)。
  • 激活触发器 SQL 语句。
  • 执行该表上的 AFTER 触发器(一般按时间、名称顺序等)。
  1. 删除触发器:
    1
    DROP TRIGGER <触发器名> ON <表名>