数据库系统(上):模型与语言 战德臣主讲课堂笔记

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

2018-08-25  本文已影响0人  天际神游

完整性

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

关系模型的完整性要求:

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

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

Integrity Constraint ::= (O, P, A, R)

数据库完整性的分类

按约束条件分类:
按约束来源分类
按约束状态分类

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

静态约束

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

-- 列约束
-- 示例: 假定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的安全机制

自主安全性

两种控制示例:

存储矩阵
利用SQL语言实现数据库自主安全性控制

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

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

超级用户(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标准中也没有限制, 看各种系统本身的控制.

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

强制安全性

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



数据库系统学习笔记

上一篇下一篇

猜你喜欢

热点阅读