数据库理论(三)——完整性约束,触发器和数据库安全

关系模型的实体完整性

实体完整性的定义:primary key(主码)

约束

1. 列级约束,在定义好属性后进行约束,只对单个属性,**约束方式**:主键,外键,唯一,检查,默认,非空
2. 表级约束,对多个属性进行约束,通常在定义好属性之后编写,**联合主码**通常使用的是表级约束,**约束方式**:主键,外键,唯一,检查

对应sql语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create table 表名(
-- 非空
属性1 类型1 not null,
-- 唯一
属性2 类型2 unique,
-- 默认
属性3 类型3 default 默认值,
-- 检查
属性4 类型4 check (只有属性4满足L条件时才能正常创建)
-- 联合组件
primary key(属性1,属性2),
-- 外码
foreign key(属性1) references 另一个表(属性1),
-- 表级检查,条件L可以对上面定义过的任意一个属性进行检查
-- 也是给完整性约束命名的句子,后面可以接primary key和foreign key,check短语
CONSTRAINT 检查函数名 CHECK ( 条件L)
)

可以使用alter table的方式对带有名字的约束进行修改

举个例子

1
2
3
4
5
6
-- 假设student表中有一个约束叫做c1
-- 先删除这个约束
alter table student drop constraint c1;
-- 再重新创建一个约束,举例就是写个满足L的检查把
alter table student add constraint c2 check (L);

定义域(感觉用得少)

1
2
3
4
5
6
7
8
9
10
11
12
-- 建立一个性别域,并声明性别域的取值范围
CREATE DOMAIN GenderDomain CHAR(2) CHECK ( VALUE IN ('男''女') );

-- 建立一个性别域,并对定义中的约束命名
CREATE DOMAIN GenderDomain CHAR(2) CONSTRAINT GD CHECK ( VALUE IN ('男''女') );

-- 删除域GenderDomain的约束GD
ALTER DOMAIN GenderDomain DROP CONSTRAINT GD;

-- 在域GenderDomain上增加约束GDD
ALTER DOMAIN GenderDomain ADD CONSTRAINT GDD CHECK ( VALUE IN ( '1''0') );

触发器

定义方式:

1
2
3
4
5
6
7
8
9
10
11
create trigger 触发器名称
-- 触发时间:before,after,instead of
-- 触发事件:insert,delete,update
触发时间 触发事件 on 表名
-- 这里用的是行级触发器,row改成statement就是语句及触发器
for each row
触发动作

-- 删除触发器
drop trigger 触发器名 on 表名;

数据库安全之强制存取控制

强制存取控制(Mandatory Access Control,MAC)

数据库对象标记为密级

对用户授予某个级别的许可证

通过用户许可证与数据库对象的密级的对应规则来决定访问权

用户的敏感度标记称为许可证级别

数据库对象的敏感度标记称为密级

敏感度标记:绝密(Top Secret)/ 机密(Secret)/ 可信(Confidential)/ 公开(Public)

强制存储规则

  1. 当主体的许可证级别<=客体的密级时 主体能写客体
  2. 当主体的许可证级别>=客体的密级时 主体能读客体

举个例子,在公司上班

第一个规则,对于员工的工作日志,员工与其同级所以可以进行读写,当领导要求员工在自己的领导笔记中记录自己的工作,这是可行的,但是员工是不能读领导的笔记的,因为里面有公司机密

第二个规则,对于领导的工作日志,领导与其领导笔记同级,可以进行读写,当领导想要阅读员工的工作笔记时,自然也是可以的,但是领导不能将自己的工作内容写在员工的笔记上,因为领导的工作内容是公司机密

数据库中的存取控制对象

image-20210523134855951

权限控制的sql语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- 带有中括号的内容是可选项,权限的地方可以写 all priviliges 表示提供所有权限
grant 权限1,权限2,权限3 [ON 对象类型 对象名称] to 用户1,用户2,用户3
-- 这个可选项是该用户是否有传播权限的权力
[with grant option]

-- 对属性列的授权时必须明确指出相应属性列名
grant update(列名),select on table 表名 to 用户

-- 撤销已授予用户的权限,可选是否级联删除,就是再经过用户3传播的权限也要回收
revoke 权限1,权限2,权限3 [on 对象类型 对象名称] from 用户1,用户2,用户3 [cascade]

-- 由于用户的权限可以从多个地方获得,为了彻底关闭某个用户的某个权限,使用revoke过于麻烦,于是使用拒绝权限
deny select,insert,update,delete on 表名 to 用户

-- 角色是一个类,用户是一个实体
-- 创建角色
create role 角色名
-- 创建用户
create user 用户名 with password 密码
-- 将角色的权利授权给用户
grant 角色名 to 用户名
-- 回收用户权利
revoke 角色名 from 用户名
-- 审计
audit alter,update on 表名
-- 取消审计
noaudit alter,update on 表名

视图作为数据库对象的一个客体,可以从其他表中抽取部分数据,然后展示出来,可以在该视图上对用户h授权避免用户查看过多的信息内容。