第八讲 SQL语言与数据库的完整性和安全性

作者: 天际神游 | 来源:发表于2018-08-25 18:18 被阅读0次

    完整性

    数据库的完整性(DB Integrity): 是指DBMS应保证DB的一种特性 -- 在任何情况下的正确性, 有效性, 和一致性.
    其包括:

    • 广义完整性: 泛指引起数据错误可能性的问题, 语义完整性, 并发控制, 安全控制, DB故障恢复等
    • 狭义完整性: 专指语义完整性, DBMS通常的完整性管理机制与程序来处理语义完整性问题.(本讲专指语义完整性)

    关系模型的完整性要求:

    • 实体完整性: 主键不为空
    • 参照完整性: 针对外键来说的, 外键必须是空或其作为主键的某一个值
    • 用户自定义完整性: 即语义完整性

    完整性管理避免用户对数据库的不正当操作.

    完整性约束条件的一般形式

    Integrity Constraint ::= (O, P, A, R)
    
    • O: 数据集合: 约束的对象, 列, 多列(元组), 元组集合
    • P: 谓词条件: 约束的条件
    • A: 触发条件
    • R: 相应动作

    数据库完整性的分类

    按约束条件分类:
    • 域完整性约束条件: 施加于某一列上(列 完整性)
    • 关系完整性约束条件: 施加于关系/table上(表 完整性)
    按约束来源分类
    • 结构约束: 来自于模型的约束(函数依赖, 主键约束, 外键约束, 数值是否可以为空)
    • 内容约束: 来自于用户的约束(用户自定义完整性, 元组或属性的取值范围)
    按约束状态分类
    • 静态约束: 要求DB在任一时候均满足的约束
    • 动态约束: 要求DB从一个状态转变为另一个状态时应满足的约束

    利用SQL语言实现数据库的完整性

    • 静态约束:
      • 列完整性: 域的完整性约束
      • 表完整性: 关系完整性约束
    • 动态约束:
      • 触发器
    静态约束

    静态完整性约束: 在定义表的时候可以设置, 后期可以添加约束, 也可以撤销约束(如果约束有名字的话, 更方便撤销)
    约束条件有:

    • not null: 列值非空
    • constraint constraint_name: 为约束命名, 便于以后撤销
    • unique: 列值是唯一
    • primary key: 主键
    • check (search_cond): 列值满足条件, 条件只能使用当前列值
    • references table_name [(colname)] [on delete {cascade | set null}]: 引用另一表table_name的列colname的值,如有on delete cascade(删除)或on delete set null(设为null)语句,则删除被引用表的某列值v时,要将本表该列值为v的记录删除或列值更新为null;缺省为无操作
    -- 列约束
    -- 示例: 假定Ssex只能取{男, 女}, 年龄在1~150之间, D#是外键
    create table Student(
    `S#` char(8) not null unique, 
    Sname char(10), 
    Ssex char(10) constrain ctssex check (Ssex='男' or Ssex='女'),
    Sage integer check(Sage>=1 and Sage<150),
    `D#` char(2) references Dept(`D#`) on delete cascade,
    Sclass char(6));
    
    -- 表约束, 在最后  ","后面定义
    -- 主键定义为S#
    create table Student(
    `S#` char(8) not null unique, 
    Sname char(10), 
    Ssex char(10) constrain ctssex check (Ssex='男' or Ssex='女'),
    Sage integer check(Sage>=1 and Sage<150),
    `D#` char(2) references Dept(`D#`) on delete cascade,
    Sclass char(6), primary key(`S#`) );
    
    -- 较为复杂的约束条件
    create Table SC(
    `S#` char(8) check(`S#` in (select `S#` from student)),
    `C#` char(3) check( `C#` in (select `C#` from course)),
    Score float(1) constraint ctscore check (Score>=0.0 and Score<=100.0));
    

    还可以通过alter table实现对约束的控制(不展开)
    add
    drop
    modify

    断言: 一个谓词表达式, 它表达了希望数据库总能满足的条件.

    create assertion <assertion-name> check <predicate>
    

    当一个断言创建后, 系统将检测其有效性, 并在每一次更新中测试更新是否违反该断言.
    断言测试增加了数据库维护的负担, 小心使用复杂的断言.
    (很少用.....)

    动态约束

    动态约束的实现 --> 触发器Trigger
    Trigger 是一种过程完整性约束, 是一段程序, 在特定时刻触发(xx前, xx后).

    -- 示例1: 设计一个触发器, 当进行Teacher表更新元组时, 使其工资只能升, 不能降
    create trigger teacher_chgsal before update of salary  -- 表示在更新前的操作
    on teacher
    referencing new x, old y  -- 对xx前后分别命名
    for each row when (x.salary < y.salary)
        begin
            raise_application_error(-20003, 'invalid salary on update'); -- 该函数是Oracle的错误处理函数
        end;
    
    -- 示例2: 假设student(`S#`, Sname, SumCourse), SumCourse为该同学已学习课程的门数, 初始值为0, 
    -- 以后每选修一门, 就自动+1
    create trigger sumc after insert on sc
        reference new row newi
        for each row
            begin
                update student set SumCourse = SumCourse + 1
                where `S#` = :newi.`S#`;   -- 更新前的row与更新后的row它们的`S#`一样
            end;
    
    -- 示例3: 假设Student(`S#`, Sname, Sage, Ssex, Sclass)中某一学生要变更其主码S#, 
    -- 此时, 其选课记录的`S#`也需要更改
    create trigger `updateS#` after update of `S#` on student
        referencing old oldi, new newi
        for each row
            begin
                update sc set `S#`=newi.`S#` where `S#`=:old.`S#`;
            end;
    

    安全性

    数据库的安全性是指DBMS应该保证的数据库的一种特性(机制或手段): 免受非法, 非授权用户的使用, 泄露, 更改或者破坏.

    DBMS的安全机制

    • 自主安全性机制: 存取控制(Access Control)
    • 强制安全性机制: 通过对数据和用户强制分类, 使得不同的用户能够访问不同类别的数据

    自主安全性

    • 授权者
    • 授权

    两种控制示例:

    • 按名称控制安全性: 存储矩阵
    存储矩阵
    • 视图
      • 视图是安全性控制的重要手段
      • 通过视图可以限制用户对关系中某些数据项的存取(只提供局部信息给用户而达到目的)
      • 通过视图和存储矩阵结合起来, 进行有效的安全性控制
    利用SQL语言实现数据库自主安全性控制

    SQL语言包括DDL, DML和DCL, 数据库安全性控制属于DCL范畴.

    3个级别大小(级别高自动包含级别低的):

    • 级别1, Select: 读
    • 级别2, Modify: 更新(插入, 更新, 删除元组)
    • 级别3, Create: 创建(创建表空间, 模式, 表, 索引, 视图等)

    超级用户(DBA) --> 账户级别(程序员用户) --> 关系级别(普通用户)

    级别1,2是关系级别的权利, 级别3称为账户级别的权利

    -- 示例, 假定高级领导是Emp0001, 部门领导Emp0021, 员工管理员为Emp2001, 收发员为Emp5001(均为UserId, 也即员工的`P#`)
    grant all priviledages on Employee to Emp2001; -- 授予账户级别
    grant select on EmpV2 to Emp5001;
    grant select on EmpV3 to public;
    grant select on EmpV4 to Emp0021;
    -- 授权 权利 on 表或者视图 to 用户
    
    -- 收回授权
    revoke select on employee from UserB;
    
    自主安全性的问题

    权利的传播

    grant select on Employee to UserB with grant option;
    grant select on Employee to UserC with grant option;
    

    传播的范围包括:

    • 水平传播数量
    • 垂直传播数量

    传播范围具体是多少, SQL标准中也没有限制, 看各种系统本身的控制.

    存在的问题:
    当一个用户被多次授权, 则会导致某一个用户回收权限时该用户仍然保留有权限.

    强制安全性

    • 强制安全性对数据对象进行安全性分级:
      绝密(Top Secret), 机密(Secret), 可信(Confidential)和无分类(Unclassified)
    • 同时也对用户进行上述的安全性分级
    • 从而强制实现不同级别用户访问不同级别数据的一种机制

    与自主安全性的区别: 可能出现多重实例, 多级关系完整性等新问题



    数据库系统学习笔记

    相关文章

      网友评论

        本文标题:第八讲 SQL语言与数据库的完整性和安全性

        本文链接:https://www.haomeiwen.com/subject/aocgiftx.html