视频 参考资料 内容来自参考链接和视频。
第四章:数据库安全性
安全性概述
不安全因素:
- 非授权用户对数据库的恶意存取和破坏
- 数据库中重要的数据泄露
- 安全环境的脆弱性
安全性控制
- 用户身份鉴别:(静态口令、动态口令、生物特征、智能卡 鉴别)
- 存取控制
- 自主存取控制方法
- 授权:授予与收回
授权语句:GRANT 格式:
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
语义:将对指定操作对象的指定操作权限授予指定的用户
发出GRANT:
- DBA
- 数据库对象创建者(即属主Owner)
- 拥有该权限的用户
按受权限的用户:
WITH GRANT OPTION子句:
不允许循环授权:
以上图来自参考链接。 例1:把查询 Student表的权限授权给用户U1.
GRANT SELECT
ON TABLE Student
TO U1;
例2:把对Student和Course表的全部操作权限 授予用户U2和U3.
GRANT ALL PRIVILEGES
ON TABLE Student,Course
TO U2,U3;
例3:把对表SC的查询权限授给所有用户 。
GRANT SELECT
ON TABLE SC
TO PUBLIC;
例4:把查询Student表和修改学生学号 的权限授给用户U4.
GRANT SELECT,UPDATE(Sno)
ON TABLE Student
TO U4;
例5:把对SC的INSERT权限授予U5,并允许将此权限再授予给其他用户 。WITH GRANT OPTION; 此语句可以使被授予的用户传播此权限
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION;
回收语句:REVOKE
格式:
REVOKE <权限>[,<权限>]...
[ON <对象类型> <对象名>]
FROM <用户>[,<用户>]...;
例1:把用户U4修改学生学号 的权限收回 。
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;
例2:收回所有用户 对表SC的查询 权限。
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;
例3:把用户U5对SC的INSERT 权限收回。
REVOKE INSERT
ON TABLE SC
FROM SC CASCADE;
注意:这里U5->U6->U7 ,使用CASCADE 会在收回U5的同时也收回U6和U7.
角色 角色指的是一类人。
创建:
CREATE ROLE<角色名>;
假设我们创建了角色名R1. 授权:R1这一类角色都获得了对Student的查询,更新,插入权限。
GRANT SELECT,UPDATE,INSERT
ON TABLE Student
TO R1;
将角色授予给其他角色或用户:小明和R2获得了R1这个角色(给R1角色添加用户)。
GRANT R1
TO 小明,R2;
收回:收回R1角色的查询Student表的权限。
REVOKE SELECT
ON TABLE Student
FROM R1;
试图机制
为不同的用户定义不同的视图,把不需要的数据隐藏起来,这样用户就不会进行误操作。
审计
把数据库所有操作都记录到审计日志中,然后就可以通过日志审查这里面是否存在非法行为。
数据加密
通过一些加密算法,把明文变成密文,这样别人就无法查看。
第五章:数据库完整性
正确性、相容性
正确性:是指数据是符合现实世界语义、反映当前实际状况的。如人类的性别,只能是男和女。 相容性:是指数据库同一对象在不同关系表中的数据是符合逻辑的。如年龄一般都在1-150岁。
为维护完整性,需要实现如下功能:
- 提供定义完整性约束条件的机制
- 提供完整性检查的方法
- 进行违约处理
三大完整性
- 实体完整性:主码唯一且非空
- 参照完整性:外码的约束——要么为空,要么对应另一张表的主码
- 用户定义完整性:有以下三点
- 非空——
NOT NULL - 列值为一——
UNIQUE - 满足某一条件表达式——
check
用户定义完整性的4种方法:
创建的时候用check进行约束
create table Student
{
Sno char(9),
Sname char(8) NOT NULL,
Ssex char(2),
check(Ssex='女' or Sname Not Like '张%');
}
用constraint进行完整性约束 例:建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
CREATE TABLE Student
(Sno NUMERIC(6)
CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
Sname 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)
);
C1、C2、C3、C4是那些完整性约束的名字。
断言 也是实现用户定义完整性的,比check高级一点。
create assertion <断言名><check子句>
例:数据库中最多只有60学生选修。
create assertion 断言名
check(
60 >= select count(*)
from SC
GROUP BY Cno;
)
只有符合check() 里面的表示式才可以执行成功,否则就会执行失败。
触发器 用户定义在关系表上的一类由事件驱动的特殊过程。
比断言更高级。
格式:
CREATE TRIGGER <触发器名>
{BEFORE| AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]
<触发动作体>
删除触发器:DROP TRIGGER <触发器名> ON <表名>
|