数据库-第四,五章作业

第四章作业

1. 什么是数据库安全性?

数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。

2. 试述实现数据库安全性控制的常用方法和技术。

数据库的安全性控制主要包括用户身份鉴别、多层存取控制、审计、视图和数据加密等安全技术.

  • 用户身份鉴别
    • 静态口令鉴别
    • 动态口令鉴别
    • 生物特征鉴别
    • 智能卡鉴别
  • 存取控制
    • 定义用户权限
    • 合法权限检查

3. 什么是数据库中的自主存取控制和强制存取控制方法。

自主存取控制:用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不用的权限,而且用户还可以将其拥有的存取权限转授给其他用户。因此自主存取十分灵活。

主要通过SQL的GRANT和REVOKE与来实现。用户权限由数据库对象和操作类型组成。定义存取权限被称为授权。

强制存储控制:每一个数据库对象被标有一定的密级,每一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法证的用户才可以存取。强制存取比较严格。

强制存取控制是对数据本身进行密级标记,无论 数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性。

4.试述角色和用户组的定义和作用。

角色的定义:数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。

角色作用:数据库角色是一组权限的集合。使用角色来管理数据库权限可以简化授权的过程,使自主授权的执行更加灵活。

用户组的定义:用户组是一组具有相同特性用户的集合。在授权或收回权限时,可以以用户组为单位进行。

用户组的作用:数据库用户组由于特性相同,因为在授权和收回权限的时候能够整体进行,效率更高。


第五章作业

1.什么是数据库的完整性

数据库的完整性是指数据的正确性相容性

正确性是指数据应具有合法的类型,包括数据类型的正确和数据范围没有溢出等等。

相容性是指表示同一个事实的两个数据应该相同,并且符合逻辑。

2. 什么是数据库的完整性约束条件

​ 完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件。它表达了给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容。

​ 主要包括关系模型的实体完整性、参照完整性用户定义完整性

3. RDBMS的完整性控制机制应具有哪些功能

  • 定义功能:提供定义完整性约束条件的机制。
  • 检查功能,检查用户发出的操作请求是否违背了完整性约束条件。
  • 违约处理,如果发现用户的操作请求使数据违背于完整性约束条件i则采取一定的动作来保证数据的完整性。

4.数据库在实现参照完整性时需要考虑哪些方面?

参照完整性往往会有一些不一致事情的发生,例如:

(1)表中增加一个元组,由于该元组对应的外码的数值在表中找不到,则会引发冲突。

(2)修改外码值,会对原本是这些外码值的元组造成影响。

(3)删除元组,导致另一个表中的某些属性的外码在该表中找不到元组。

等等。

所以要采取的策略主要有:

(1)拒绝执行(NOT ACTION)

(2)级联执行(CASCADE)

当遇到不一致的情况,就把所有不一致的情况删除。

(3)设置为空值

当删除或者修改参照表中的一个元组造成不一致的时候,就将不一致的元组的属性设置为空值。


实验

第一题

(1)创建用户王明,并授予他对学生表的SELECT权限

1
2
3
CREATE USER '王明'@'%' IDENTIFIED BY '123456p';
GRANT SELECT ON db1.`学生表` TO '王明'@'%';
flush privileges;

效果:

(2)授予用户王明对学生表的INSERT和DELETE权限

1
GRANT INSERT,DELETE ON db1.`学生表` TO '王明'@'%';

(3)授予用户王明对选课表的SELECT权限和对成绩字段的UPDATE权限

1
GRANT SELECT,UPDATE(Grade) ON db1.`选课表` TO '王明'@'%';

(4)授予用户王明创建表的权限

1
GRANT ALL PRIVILEGES ON db1.* TO '王明'@'%';

(5)授予用户王明对学生表的所有权限,并具有转授给他人的权力

1
GRANT ALL PRIVILEGES ON db1.`学生表` TO '王明'@'%' WITH GRANT OPTION;

(6)撤销用户王明对学生表的INSERT和DELETE权限

1
REVOKE INSERT,DELETE ON db1.`学生表` FROM '王明'@'%';

(7)撤销用户王明对选课表的SELECT权限和对成绩字段的UPDATE权限

1
REVOKE SELECT,UPDATE(Grade) ON db1.`选课表` FROM '王明'@'%';

(8)撤销用户王明创建表的权限

1
REVOKE ALL PRIVILEGES ON db1.* FROM '王明'@'%';

(9)使得用户王明只能查看每个班级的最高分、最低分、平均分,但不能查看每个学生所选课程的具体成绩。

1
2
3
4
5
GRANT 
SELECT MAX(`成绩`),MIN(`成绩`),AVG(`成绩`)
FROM `选课表`
GROUP BY `班级`
ON db1.`选课表` TO '王明'@'%';

第二题

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
#创建一个用于成绩定档的函数
set global log_bin_trust_function_creators=TRUE;#不添加这一行会报错

DELIMITER $$
DROP FUNCTION IF EXISTS gradeLevel$$
CREATE FUNCTION gradeLevel(grade int) RETURNS VARCHAR(20)
BEGIN
DECLARE str VARCHAR(50) DEFAULT '';
IF (grade < 60) THEN
set str='不及格';
ELSEIF (grade < 70 ) THEN
set str='及格';
ELSEIF (grade < 80) THEN
set str = '中等';
ELSEIF (grade < 90) THEN
set str = '良好';
ELSE
set str = '优秀';
END IF;
return str;
END $$
DELIMITER ;

SELECT `学生表`.`学号`,`学生表`.`姓名`,`课程表`.`课程名`,`选课表`.`成绩`,gradeLevel(`选课表`.`成绩`)
FROM `学生表`,`选课表`,`课程表`
WHERE `学生表`.`学号` = `选课表`.`学号` AND `课程表`.`课程号` = `选课表`.`课程号`;

结果如图:

第三题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#==============定义一个存储过程==============
DELIMITER $$
CREATE
PROCEDURE getGrade(IN course VARCHAR(255))
-- 存储过程体
BEGIN
-- 把SQL中查询的结果通过INTO赋给变量 INTO SNO INTO sname INTO grade
SELECT `学生表`.`学号` ,`学生表`.`姓名` ,`选课表`.`成绩`
FROM
`学生表`,`选课表`,`课程表`
WHERE
`学生表`.`学号` = `选课表`.`学号` AND `课程表`.`课程号` = `选课表`.`课程号` AND `课程表`.`课程名`= course;

END$$
DELIMITER ;

DROP PROCEDURE getGrade;


CALL getGrade('数据库');

结果如下所示:

第四题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#=========创建一张教授的表============
CREATE TABLE `教授`(
`name` VARCHAR(20),
`money` INT NOT NULL,
PRIMARY KEY(`name`)
);

INSERT INTO `教授` VALUES('professor',1000);

SELECT * FROM 教授;
#=========定义一个触发器==============
#注意:要对new的数据进行修改和赋值,必须是BEFORE
DELIMITER $$
DROP TRIGGER IF EXISTS AgeIncrease;
CREATE TRIGGER AgeIncrease
BEFORE UPDATE ON `教授`
FOR EACH ROW
BEGIN
-- DECLARE sum int;
if new.`money` < old.`money` then
set new.`money`=old.`money`;
end if;
END$$
DELIMITER;

当把教授的工资设置为2000时,

1
2
3
UPDATE `教授`
SET `money`=2000
WHERE `教授`.`name`='professor';

设置成功。

如果此时把教授的工资重新改为1000,则会显示:

可见不起效果,工资只增不减。