第八讲 SQL语言与数据库的完整性和安全性
2018-08-25 本文已影响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标准中也没有限制, 看各种系统本身的控制.
存在的问题:
当一个用户被多次授权, 则会导致某一个用户回收权限时该用户仍然保留有权限.
强制安全性
- 强制安全性对数据对象进行安全性分级:
绝密(T
opS
ecret), 机密(S
ecret), 可信(C
onfidential)和无分类(U
nclassified) - 同时也对用户进行上述的安全性分级
- 从而强制实现不同级别用户访问不同级别数据的一种机制
与自主安全性的区别: 可能出现多重实例, 多级关系完整性等新问题