数据库系统原理 实验4 触发器和存储过程

数据库系统原理 实验4 触发器和存储过程

一. 实验目的

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)。
学员实体增加属性 是否毕业
综上 学员实体
数据库系统原理 实验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
)

数据库系统原理 实验4 触发器和存储过程_第2张图片
训练实体
数据库系统原理 实验4 触发器和存储过程_第3张图片

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
)

在这里插入图片描述

考试实体
数据库系统原理 实验4 触发器和存储过程_第4张图片

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)。
添加触发器
数据库系统原理 实验4 触发器和存储过程_第5张图片
触发器定义

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 ;

当添加练车记录时,同步更新学员表中的累计练车时间(小时数)。
添加触发器
数据库系统原理 实验4 触发器和存储过程_第6张图片
触发器定义

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)当添加考试申请记录时,如果是“理论”考试,则同步检查学员是否学完全部课程(规则各组拟定);如果是“实践”考试,则同步检查学员的理论考试是否已经通过,并且累计练车时间是否达到规定要求(规则各组拟定)。
添加触发器
数据库系统原理 实验4 触发器和存储过程_第7张图片
触发器定义

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)。
添加触发器
数据库系统原理 实验4 触发器和存储过程_第8张图片
触发器定义

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 ;

原创不易 转载请标明出处
帮你解决了作业难题
给个赞不过分吧
请添加图片描述

你可能感兴趣的:(数据库实验,数据库,database)