玩命加载中 . . .

数据库的安全性和完整性


数据库的安全性

安全性控制

用户标识和鉴定

这是系统提供的最外层的安全保护措施,常用方法包括:

  • 静态口令鉴别

    静态不变的口令,由用户自己设定,比如自己设置的密码。

  • 动态口令鉴别

    动态可变的口令,每次访问数据库时都不同,比如短信密码、动态令牌。

  • 生物特征鉴别

  • 智能卡鉴别

存取控制机制

数据库安全最重要的一点,是确保只授权给有资格的用户访问数据库的权限,同时令未被授权的人员无法接近数据。

自主存取控制

这里面涉及了一个很重要的概念——用户权限,它包括两个要素:

  • 数据库对象
  • 操作类型

授权——权限授予: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

文章作者: 鹿卿
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 鹿卿 !
评论
  目录