数据库的安全性
安全性控制
用户标识和鉴定
这是系统提供的最外层的安全保护措施,常用方法包括:
静态口令鉴别
静态不变的口令,由用户自己设定,比如自己设置的密码。
动态口令鉴别
动态可变的口令,每次访问数据库时都不同,比如短信密码、动态令牌。
生物特征鉴别
智能卡鉴别
存取控制机制
数据库安全最重要的一点,是确保只授权给有资格的用户访问数据库的权限,同时令未被授权的人员无法接近数据。
自主存取控制
这里面涉及了一个很重要的概念——用户权限,它包括两个要素:
- 数据库对象
- 操作类型
授权——权限授予:GRANT
语法格式如下:
GRANT <权限> [, 权限]...
ON <对象类型><对象名> [,<对象类型><对象名>]
TO <用户> [, 用户]...
[WITH GRANT OPTION]
- 它表示向用户授予操纵数据库对象的权限;
- 如果指定了WITH GRANT OPTION,表示被授权的用户还可以继续把这种权限授予他人,否则只能使用权限,不能传播权限。
授权——权限收回:REVOKE
语法格式如下:
REVOKE < 权限> [, 权限] …
ON < 对象类型> < 对象名> [, < 对象类型> < 对象名>]
FROM < 用户> [, 用户] … [CASCADE | RESTRICT];
CASCADE: 级联回收,该“被回收权限的用户”传播的权限也被回收
注意级联的对象的权限可能来自多个用户。
RESTRICT: 存在级联回收时拒绝执行权限回收
比如收回Bob修改Course表中课程号的权限:
REVOKE UPDATE(Cno) ON TABLE Course
FROM Bob;
模式的授权
允许用户创建关系时声明外码
GRANT REFERENCES(被参照属性)
ON 被参照关系
TO 用户;
创建数据库模式的权限
对创建数据库模式一类的数据库对象的授权,由管理员创建用户时实现:
CREATE USER
CREATE USER <用户名> [WITH] [DBA|RESOURCE|CONNECCT]
数据库角色
分为角色的创建、授权、授予其他用户:
CREATE ROLE <角色名>;
GRANT <权限> [,权限]
ON <对象类型><对象名>
TO <角色>[, 角色]...;
GRANT <角色> [,角色]...
TO <目标角色|用户>...
WITH ADMIN OPTION;
类似地,也有角色权限的收回、角色的收回(均用到REVOKE)。
审计
审计,启用一个专用的审计日志,系统自动将用户对数据库的所有操作记录在上面
数据加密
数据库完整性
完整性约束通常包括:
- 域完整性
- 实体完整性
- 关联完整性
- 用户定义完整性
其中,域完整性、实体完整性和关联完整性,是关系模型必须满足的完整性约束条件。
域完整性
保证关系表属性取值的合理性,例如:
- 属性值应该是域中的值
- 一个属性能否为NULL,列值是否唯一
在创建表时可以定义
- 列值非空
- 列值唯一
- 检查列值是否满足一个布尔表达式
- 设置属性默认值
CREATE TABLE DEPT
(Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE, /*要求Dname列值唯一*/
Location CHAR(10) DEFAULT '哈尔滨', /*设置了Location的默认值为“哈尔滨”*/
PRIMARY KEY(Deptno)) /*部门编号Deptno列为主码*/
实体完整性
指关系的主码不能重复也不能去空值。
在CREATE TABLE中使用 PRIMARY KEY来定义主码。
参照完整性
与外键有紧密联系。
在CREATE TABLE 中使用FOREIGN KEY短语定义哪些列为外码,用REFERENCES 短语指明这些外码参照哪些表的主码。
关系SC 中一个元组表示一个学生选修的某门课程的成
绩,(Sno ,Cno )是主码。Sno ,Cno 分别参照引用
Student 表的主码和Course 表的主码:
/*[例3] ] 定义SC 中的参照完整性 */
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), /* 在表级定义实体完整
性*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/* 在表级定义参照完整性*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/* 在表级定义参照完整性*/
);
用户定义的完整性
属性上的约束条件
元组上的约束条件
CHECK子句可以设置不同属性之间的取值的相互约束条件。
断言
CREATE ASSERTION <断言名> <Check子句>
DROP ASSERTION <断言名>
例如,声明一个断言,用于限制每一门课程最多选课学生数量为60:
CREATE ASSERTION ASSE_SC_CNUM1
CHECK(60 >= ALL(SELECT count(*)
FROM SC
GROUP BY cno);
触发器
- 触发器是由用户定义在关系表上的一类由事件驱动的特殊过程。基本语法如下:
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
REFERENCING NEW|OLD ROW|TABLE AS <变量>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>] <触发动作体>;
触发器又称“事件-条件-动作”规则。
- 触发事件,包括INSERT, DELETE, UPDATE等
- BEFORE表示触发事件操作执行之前激活触发器,AFTER表示触发事件操作执行之后激活触发器
- FOR EACH后面的标识指定的是行级触发器还是语句级触发器
- WHEN 表示触发条件,当触发器被激活时,只有当触发条件为真时,触发动作体才执行,如果省略,触发器激活后触发动作体立即执行
- 行级触发器中,可以使用NEW ROW和OLD ROW 来引用UPDATE / INSERTION之后的新值和之前的旧值,语句级触发器则使用NEW TABLE和OLD TABLE引用包含所有被影响的行的临时表。
\begin{flalign}
\end{flalign}
1.
CREATE TABLE Student
(Sno CHAR(10) PRIMARY KEY,
Sname CHAR(10) UNIQUE,
Ssex CHAR(1),
Sage SMALLINT,
Sdept CHAR(10)
);
CREATE TABLE Course
(Cno CHAR(3) PRIMARY KEY,
Cname CHAR(10) UNIQUE,
Cpno CHAR(10),
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno));
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(3),
Grade SMALLINT,
PRIMARY KEY(Sno, Cno),
FOREIGN KEYS(Sno) REFERENCES Student(Sno),
FOREIGN KEYS(Cno) REFERENCES Course(Cno));
2.
2.1
SELECT *
FROM Employee, Works
WHERE company_name='Baidu Corporation' AND salary>100;
2.2
SELECT manager_name
FROM Manages
2.3
SELECT person_name
FROM Manages
WHERE manager_name='Hans Write'
2.4
SELECT SUM(salary)
FROM Works
GROUP BY company_name;
2.5
SELECT company_name
FROM Employee, Works
WHERE street='Wenhua West Road' AND city='威海市';
2.6
SELECT person_name
FROM Manages, Employee Employee1, Employee Employee2
WHERE Manages.person_name=Employee1.person_name AND
Manages.manager_name=Employee2.person_name AND
Employee1.city=Employee2.city AND
Employee1.street=Employee2.street;
2.7
SELECT person_name
FROM Works
WHERE company_name!='Baidu Corporation'
3.
3.1
SELECT Grade
FROM Student, SC, Course
WHERE Sdept='CS' AND Cname='数据库';
3.2
SELECT AVG(Grade)
FROM Student, SC
WHERE Sdept='CS' AND Ssex='女'
GROUP BY Sname;
3.3
WITH Temp AS
(SELECT Sno
FROM Student, SC
WHERE Sdept='CS'
GROUP BY Sname
HAVING AVG(Grade) > 85)
SELECT Sno, COUNT(C)
FROM Temp
WHERE Grade>90
GROUP BY Sno