第八讲 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语言与数据库的完整性和安全性

    完整性 数据库的完整性(DB Integrity): 是指DBMS应保证DB的一种特性 -- 在任何情况下的正确性...

  • 1_MySQL数据库1

    数据库的安装 服务启动 登陆数据库 sql 语言分类 常用命令 数据类型 实体完整性 域完整性 引用完整性 多表查...

  • BAND-P4:数据分析与SQL学习笔记

    一. 数据库与SQL语言简介简介 1.1 SQL:与数据库交互的语言 SQL的全称是结构化查询语言(Structu...

  • 【1】SQL基础——初识

    1.SQL 与 数据库系统之间的关系: SQL是用于访问和处理数据库的标准的计算机语言 SQL可以与数据库系统协同...

  • 第3章《SQL》- 笔记

    SQL包括以下几部分 数据定义语言(DDL)数据操纵语言(DML)完整性视图定义事务控制嵌入式SQL和动态SQL授...

  • 数据库 06

    第6章 初探SQL 这里讲关系数据库标准语言SQL。 SQL(Structured Query Language)...

  • 黑猴子的家:SQL 概述

    1、SQL语言概述 SQL(Structure Query Language):专门用来与数据库通信的语言。 S...

  • MySQL必知必会1-9

    1 了解SQL SQL=structured query language,是用来与数据库通信的语言;数据库(da...

  • MySql的基础用法

    概念 SQL:对数据库进行查询和修改的语言叫做SQL,SQL的含义结构化查询语言

  • 数据库SQL语言入门(一)

    系列文章 数据库SQL语言入门(二)数据库SQL语言入门(三) SQL简介 SQL 是 Structure Que...

网友评论

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

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