1、理解触发器的作用,能够使用触发器进行数据库完整性检查。
2、理解存储过程的作用和工作机制,能够运用SQL语言编写存储过程来完成指定的功能,并使用SQL执行存储过程完成测试;
3、了解自定义函数的作用,能够在SQL代码中调用自定义函数;
4、强化详细设计能力和编程能力。
在实验3的基础上,使用存储过程(必选)、自定义函数(根据需求自选)、触发器(必选)等过程对象,完成下面实验内容中规定的事务需求。
在数据库设计实验的基础上,完成如下任务。
1)针对核心表,分别编写存储过程实现单条记录(按主键字段)的查询、增加、修改和删除功能。
2)编写存储过程、触发器实现系统的核心业务功能(即上面第1条之外的核心复杂功能),具体要求如下。
根据实验3中所选题目,相应做如下任务:
A.针对驾校管理系统:
存储过程列表:
(1) 查询所有分校校长的名字和电话号码;
(2) 按城市、分校名称和教练性别,查询教练的基本信息;
(3) 按城市汇总查询每个分校的员工人数;
(4) 按年龄查询超过该年龄并且担任教练的员工信息;
(5) 按年、月查询通过汽车驾驶测试的驾校学员名单及通过时间。
触发器列表:
(1)当学员注册完成时,同步更新分校表中的学员人数(加1)。
学员实体增加属性 所属学校ID
(2)当添加练车记录时,同步更新学员表中的累计练车时间(小时数)。
要有练车记录实体 包含练车ID 练车学员ID 练车时长
(3)当添加考试申请记录时,如果是“理论”考试,则同步检查学员是否学完全部课程(规则各组拟定);如果是“实践”考试,则同步检查学员的理论考试是否已经通过,并且累计练车时间是否达到规定要求(规则各组拟定)。
要有考试申请实体 包含考试ID 考试类型 理论考试 type为0 实践考试type为1
学员实体增加属性 练车时长 课程学习状态 0 尚未学完 1 已学完 学员考试状态 0 尚未通过 1 理论考试已通过 2 所有考试已通过
(4)当实践考试合格后,同步修改学员表的“是否毕业”字段,并同步更新分校表中的学员人数(减1)。
学员实体增加属性 是否毕业
(1)当学员注册完成时,同步更新分校表中的学员人数(加1)。
学员实体增加属性 所属学校ID
(2)当添加练车记录时,同步更新学员表中的累计练车时间(小时数)。
要有练车记录实体 包含练车ID 练车学员ID 练车时长
(3)当添加考试申请记录时,如果是“理论”考试,则同步检查学员是否学完全部课程(规则各组拟定);如果是“实践”考试,则同步检查学员的理论考试是否已经通过,并且累计练车时间是否达到规定要求(规则各组拟定)。
要有考试申请实体 包含考试ID 考试类型 理论考试 type为0 实践考试type为1
学员实体增加属性 练车时长 课程学习状态 0 尚未学完 1 已学完 学员考试状态 0 尚未通过 1 理论考试已通过 2 所有考试已通过
(4)当实践考试合格后,同步修改学员表的“是否毕业”字段,并同步更新分校表中的学员人数(减1)。
学员实体增加属性 是否毕业
综上 学员实体
学员实体
CREATE TABLE `student` (
`ID` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '学员ID',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL COMMENT '学员姓名',
`state` int(5) NOT NULL COMMENT '学员考试状态 0 尚未通过 1 理论考试已通过 2 所有考试已通过',
`time` datetime NOT NULL COMMENT '通过时间',
`CoachId` int(10) NOT NULL COMMENT '教练ID',
`TrainingTime` float(5, 2) NOT NULL COMMENT '练车时长',
`SchoolId` int(11) NOT NULL COMMENT '学校ID',
`CourseStatus` int(2) NOT NULL COMMENT '课程学习状态 0 尚未学完 1 已学完',
`graduation` int(2) NOT NULL COMMENT '是否毕业 0 尚未毕业 1 已毕业',
`ApplyTestType` int(3) NOT NULL COMMENT '申请类型 0 理论 1 实践',
`TheoreticalState` int(2) NOT NULL COMMENT '理论考试状态 0 未通过 1 已通过',
PRIMARY KEY (`ID`) USING BTREE,
INDEX `CoachId`(`CoachId`) USING BTREE,
CONSTRAINT `CoachId` FOREIGN KEY (`CoachId`) REFERENCES `coach` (`ID`) ON DELETE RESTRICT ON UPDATE RESTRICT
)
CREATE TABLE `train` (
`ID` int(3) NOT NULL COMMENT '练车ID',
`TrainerID` int(3) NOT NULL COMMENT '练车学员ID',
`TrainingTime` float(5, 2) NOT NULL COMMENT '练车时长',
PRIMARY KEY (`ID`) USING BTREE
)
CREATE TABLE `test` (
`ID` int(3) NOT NULL AUTO_INCREMENT COMMENT '考试ID',
`type` int(1) NOT NULL COMMENT '考试类型 理论考试 type为0 实践考试type为1',
`studentID` int(5) NOT NULL COMMENT '考试学员ID',
`results` int(255) NULL DEFAULT NULL COMMENT '考试结果 0 尚未通过 1 理论考试已通过 2 所有考试已通过',
PRIMARY KEY (`ID`) USING BTREE
)
当学员注册完成时,同步更新分校表中的学员人数(加1)。
添加触发器
触发器定义
BEGIN
UPDATE school SET TotalNumberOfEmployees = (TotalNumberOfEmployees + 1) WHERE school.ID = student.SchoolId;
END
完整
delimiter ;;
CREATE TRIGGER `registration` AFTER UPDATE ON `student` FOR EACH ROW BEGIN
UPDATE school SET TotalNumberOfEmployees = (TotalNumberOfEmployees + 1) WHERE school.ID = student.SchoolId;
END
;;
delimiter ;
当添加练车记录时,同步更新学员表中的累计练车时间(小时数)。
添加触发器
触发器定义
BEGIN
UPDATE student SET TrainingTime = (student.TrainingTime + train.TrainingTime) WHERE train.TrainerID = student.ID;
END
完整
delimiter ;;
CREATE TRIGGER `CarTraining` AFTER UPDATE ON `train` FOR EACH ROW BEGIN
UPDATE student SET ApplyState = (student.TrainingTime + train.TrainingTime) WHERE train.TrainerID = student.ID;
END
;;
delimiter ;
(3)当添加考试申请记录时,如果是“理论”考试,则同步检查学员是否学完全部课程(规则各组拟定);如果是“实践”考试,则同步检查学员的理论考试是否已经通过,并且累计练车时间是否达到规定要求(规则各组拟定)。
添加触发器
触发器定义
BEGIN
IF student.ApplyState = 0 AND student.CourseStatus = 1 THEN
INSERT INTO test(type,studentID,results) VALUES(ApplyState, student.ID, 0);
END IF;
IF student.ApplyState = 1 AND student.TheoreticalState = 1 AND student.TrainingTime = 1 THEN
INSERT INTO test(type,studentID,results) VALUES(ApplyState, student.ID, 0);
END IF;
END
完整
delimiter ;;
CREATE TRIGGER `application` BEFORE INSERT ON `test` FOR EACH ROW BEGIN
IF test.results = 1 AND student.ID = test.studentID THEN
UPDATE school SET TotalNumberOfEmployees = (TotalNumberOfEmployees - 1) WHERE student.SchoolID = school.ID;
END IF;
END
;;
delimiter ;
(4)当实践考试合格后,同步修改学员表的“是否毕业”字段,并同步更新分校表中的学员人数(减1)。
添加触发器
触发器定义
BEGIN
IF test.results = 1 AND student.ID = test.studentID THEN
UPDATE school SET TotalNumberOfEmployees = (TotalNumberOfEmployees - 1) WHERE student.SchoolID = school.ID;
END IF;
END
完整
delimiter ;;
CREATE TRIGGER `
graduation` BEFORE UPDATE ON `test` FOR EACH ROW BEGIN
IF test.results = 1 AND student.ID = test.studentID THEN
UPDATE school SET TotalNumberOfEmployees = (TotalNumberOfEmployees - 1) WHERE student.SchoolID = school.ID;
END IF;
END
;;
delimiter ;
针对网络考试系统:
存储过程列表:
(1)查询所有考生的名字和入学年份;
(2)给定考生id,查询答卷表。
(3)给定年龄,查询小于该年龄的所有考官信息。
(4)按月查询通过考试的考生名单;
触发器列表:
(1)建立Insert触发器,若插入考生表的考号长度不为10位,提示“考号格式错误”。
(2)建立Update触发器,若考生表中的考号修改,则答卷表中的考号相应修改。
(3)建立Delete触发器,若考生表中的考号被删除,则删除答卷表中的相应记录。
4)其他内容自选(可选)。
遇到问题 第一次写触发器 不知如何写
解决方案
转自改博客
触发器创建
DELIMITER $
CREATE TRIGGER 触发器名称
BEFORE|AFTER //表示是在操作之前还操作之后触发
INSERT|UPDATE|DELETE //是添加、修改、删除的意思
ON 表名 //表示是对哪一张表进行添加、修改或者删除的时候触发我们要的操作
[FOR EACH ROW] – 行级触发器
BEGIN
触发器要执行的功能;
END$
DELIMITER ;
原创不易 转载请标明出处
帮你解决了作业难题
给个赞不过分吧