第四章 、数据库的安全性
非法使用数据库的情况
- 编写合法程序绕过DBMS及其授权机制
- 直接或编写应用程序执行非授权的操作
- 通过多次合法查询数据库中推导出一些保密数据
- 破坏安全性的行为可能是无意的,故意的,恶意的
数据库安全控制层次
数据安全性控制的常用方法
- 用户标识和鉴定
- 存取控制
- 视图
- 审计
- 密码存储
--创建一个sql server验证模式的登录名
create login 'abc' with password='abc123!'
自主存取控制方法
- 通过SQL的grant 语句和revoke语句实现
- 用户权限组成
-
- 数据对象
-
- 操作类型
- 定义存取权限称为授权
关系数据库系统中存取控制对象
对象类型 | 对象 | 操作类型 |
---|---|---|
数据库 | 模式 | create schema |
基本表 | create table alter table | |
模式 | 视图 | create view |
索引 | create index | |
数据 | 基本表和视图 | select index update delete references all privileges |
数据 | 属性列 | select insert update references all privileges |
grant(将对指定对象的指定操作权限授予指定用户)
-- 创建一个用户U1,U2,U3,U4,U5
create login u1 with password = '123.';
create login u2 with password = '123.';
create login u3 with password = '123.';
create login u4 with password = '123.';
create login u5 with password = '123.';
create user u11 for login u1;
create user u12 for login u2;
create user u13 for login u3;
create user u14 for login u4;
create user u15 for login u5;
--把查询student 表的权限授予u1
grant select on student to u1;
--把对SC查询权限授予所有用户
grant select on sc to public;
-- 收回对sc表的所有权限
revoke select on sc from public;
--8)把对表SC的insert权限授予u1,并且徐云将此权限在授予其它用户
grant insert
on sc
to u1
with grant option
--通过劫色来实现把一组权限授予一个用户
grant insert,update,select on sc to u11;
--把对student表和course表的全部权限授予用于u2和u3
grant all privileges
on student
to uu2,uu3;
--把查询student表和修改学生学号的权限给用户uu4
grant select,update(sno)
on student
to uu4;
--安保用户uu5对sc表的insert权限收回
--cascade收回的时候,收回连续的权利
revoke insert
on sc
from uu6
cascade;
--创建角色
create role r1;
grant insert ,update ,select on sc to r1;
-- 将角色授权给用户
--grant r1 to u11,uu2;--不符合SQL语法
exec sp_addrolemember r1,u11;
--将角色从用户收回
exec sp_droprolemember r1,u11;
视图机制
- 视图机制要把保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护
-
- 视图机制更主要的功能在于提供数据的独立性,其安全保护功能不太精细,往往不能达到应用系统的要求。
-
- 间接实现了支持存取谓词的用户权限的定义。
--建立计算机系学生的视图,把对该视图的SELECT限授于u11,把该视图上的所有操作权限授于张明。
--1、先建立视图
create view cs_student
as
select * from student where sdept='cs'
grant all privileges on cs_student to u11;
审计
- 审计日志(Audit log)
-
- 将用户对数据库的所有操作记录在上面
- DBA利用审计日志
-
- 找出非法存取数据的人,时间和内容
- C2以上安全级别的DBMS必须具有
数据库的完整性与安全性
为了维护数据库的完整性,DBMS必须
- 提供定义完整性约束条件的机制
- 提供完整性检查方法
- 违约处理
定义SC的参照完整性
create table sc
(
sno char(9) not null,
cno char(9) not null,
grade smallint,
primary key(sno,cno),
foreign key (sno) references student(sno),
foreign key (cno) references course(cno),
)
参照完整性检查和违约处理
被参照表(student) | 参照表(sc) | 违约处理 |
---|---|---|
可能破坏参照完整性 | 插入元组 | 拒绝 |
可能破坏参照完整性 | 修改外码值 | 拒绝 |
删除元组 | 可能破坏参照完整性 | 拒绝/级联/删除/设置为空值 |
修改主码值 | 可能破坏参照完整性 | 拒绝/级联/删除/设置为空值 |
显示说明参照完整性的违约处理
create table sc1
(
sno char(9) not null,
cno char(4) not null,
grade smallint,
primary key (sno,cno),
foreign key (sno) references student(sno)
on delete cascade /*级联删除sc表中相应的元组*/
on update cascade, /*级联更新sc表中相应的元组*/
foreign key (cno) references course(cno)
on delete no action
/* 当删除course表中的元组造成与sc表不一致的时候拒绝删除*/
on update cascade
/*当更新course表中cno中,级联更新sc表宏相应的元组*/
)
用户定义的完整性
-
属性上的约束条件和定义
-
属性上的约束条件检查和违约处理
-
元组上的约束条件的定义
-
元组上的约束条件检查和违约处理
-
- create table 时定义
-
-
- 列值非空(Not null)
-
-
-
- 列值唯一(unique)
-
-
-
- 检查列值是否满足一个布尔表达式(check)
-
create table student1
(
sno char(9) unique,
sname char(8) not null,
ssex char(2),
sage smallint,
sdept char(20),
primary key (sno),
check (ssex='女' or sname not like 'Ms.%')
)
完整性约束命名子句
- 完整性约束命名字句
- 修改表中的完整性限制
建立学生登记表Student2,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”
create table student2
(
sno numeric(9)
constraint c1 check (sno between 90000 and 99999),
cname char(20)
constraint c2 not null,
sage numeric(3)
constraint c3 check (sage<30),
ssex char(2)
constraint c4 check (ssex in ('男','女')),
constraint studentKey primary key(sno)
)
建立教师表Teacher,要求每个教师的应发工资 不低于3000元。(应发工资等于实发工资Sal和扣除项Deduct之和)
create table teacher
(
tno numeric(4) primary key,
tname char(10),
job char(8),
sal numeric(7,2),
deduct numeric(7,2),
deptno numeric(7,2),
constraint t_c1 check (sal+deduct>=3000)
);
修改表中的完整性限制
- 简单来说:就是先删除,在增加(到底是怎么实现的吗?看下面几个列子)
修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40 。
--修改表Student2中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40 。
alter table student2 drop constraint c1;
alter table student2 add constraint c1 check (sno between 900000 and 999999);
alter table student2 drop constraint c3;
alter table student2 add constraint c3 check(sage<40);
关系数据库理论
回顾
完整性约束的表现形式
- 限定属性取值范围:例如成绩必须在0~100之间
- 定义属性值间的相互关连
数据依赖的类型
- 函数依赖(Functional Dependency ,简称为FD)
- 多值依赖 (Multivalued Dependency,简称为MVD)
- 其他
关系模式的简化表示
一个数据库可能会出现的问题
-
数据冗余太大
-
更新异常
-
插入异常
-
删除异常
-
- 原因:由存在于关系模式中的某些数据依赖引起的
-
- 解决方法:通过分解关系模式来消除其中不合适