数据库原理与应用实验十一 触发器的使用

时间:2025-04-09 18:04:15

目录

  • 实验十一 触发器的使用
    • 一、实验目的
      • 1.了解触发器的概念、特点和作用。
      • 2.掌握SQL SERVER 创建和管理触发器的方法。(school数据库详见于 作者博客文章)
    • 二、实验内容及要求
      • l.为deparment表增加一列teac_num用于统计各个系教师的人数。
      • 2.更新teac_num列,让其正确统计当前数据库中各个系教师的人数。
      • 3.在Teacher表中创建一个insert触发器trigger_in_teacher,使得某系增加新教师时,该系对应的teac_num列自动变化。
      • 4.创建一个update触发器trigger_update_course,修改课程表中Course中的某门课的课程号时,对StudentGrade,CourseTeacher中课程号也做相应修改。
        • 测试该触发器:将“数据库”的课程号改为“1110”,修改能否顺利执行?如不能,原因是什么?
      • 5.创建一个触发器trigger_course,当修改课程数据表course中的数据时(包括插入、更新和删除操作),显示提示信息“课程表被修改了”。
        • 测试该触发器:将“数据库”的学时改为80,将“数据结构”的课程号改为“5010”,修改能否顺利执行?系统有何反应?如不能,原因是什么?
        • 测试该触发器:将“古代汉语”删除,删除能否顺利执行?系统有何反应?如不能,原因是什么?
      • 6.删除trigger_ course触发器。
    • 三、实验小结
      • 1.触发器的主要作用是实现数据的完整性和一致性。如何正确使用触发器?
      • 2.触发器可以划分为几种类别?分别是什么?

实验十一 触发器的使用

一、实验目的

1.了解触发器的概念、特点和作用。

2.掌握SQL SERVER 创建和管理触发器的方法。(school数据库详见于 作者博客文章)

二、实验内容及要求

本实验使用数据库为SCHOOL数据库。

l.为deparment表增加一列teac_num用于统计各个系教师的人数。

use school
ALTER TABLE Deparment  
ADD  teac_num  int

2.更新teac_num列,让其正确统计当前数据库中各个系教师的人数。

use school
UPDATE deparment
SET teac_num =(SELECT COUNT(Teac_id)
FROM Teacher
WHERE Deparment.Depar_id=Teacher.Depar_id)

3.在Teacher表中创建一个insert触发器trigger_in_teacher,使得某系增加新教师时,该系对应的teac_num列自动变化。

CREATE TRIGGER trigger_in_teacher ON Teacher
FOR INSERT
AS
BEGIN
	UPDATE Deparment
	SET Teac_num=Teac_num+(SELECT COUNT(*)
			FROM INSERTED
			WHERE Deparment.Depar_id=INSERTED.Depar_id)
END

4.创建一个update触发器trigger_update_course,修改课程表中Course中的某门课的课程号时,对StudentGrade,CourseTeacher中课程号也做相应修改。

CREATE TRIGGER trigger_update_course
ON	Course
FOR UPDATE 
AS
BEGIN
	UPDATE StudentGrade
	SET Course_id=(SELECT Course_id FROM inserted)
	WHERE Course_id IN (SELECT Course_id FROM deleted)
	UPDATE CourseTeacher
	SET Class_id=(SELECT Class_id FROM inserted)
	WHERE Class_id IN (SELECT Class_id FROM deleted)
END
测试该触发器:将“数据库”的课程号改为“1110”,修改能否顺利执行?如不能,原因是什么?
UPDATE Course
SET Course_id='1110'
WHERE Course_name='数据库'

不能。UPDATE 语句与 REFERENCE 约束"FK_StudentGrade_Course"冲突。该冲突发生于数据库"school",表"", column ‘Course_id’。表StudentGrade与表Course外键连接

如果想要解决可以选择删除此外键关系再执行(但为了后续实验,如果删除了,建议加上去)

5.创建一个触发器trigger_course,当修改课程数据表course中的数据时(包括插入、更新和删除操作),显示提示信息“课程表被修改了”。

CREATE TRIGGER trigger_course ON Course
FOR INSERT,UPDATE,DELETE
AS
BEGIN
	PRINT'课程表被修改了'
END
测试该触发器:将“数据库”的学时改为80,将“数据结构”的课程号改为“5010”,修改能否顺利执行?系统有何反应?如不能,原因是什么?
UPDATE Course
SET Course_hour='80' 
WHERE Course_name='数据库'

将“数据库”的学时改为80是可以执行的。

UPDATE Course
SET Course_id='5010' 
WHERE Course_name='数据结构'

将“数据结构”的课程号改为“5010”不能顺利执行

因为UPDATE 语句与 REFERENCE 约束"FK_StudentGrade_Course"冲突。表StudentGrade与表Course外键连接
如果想要解决可以选择删除此外键关系再执行

测试该触发器:将“古代汉语”删除,删除能否顺利执行?系统有何反应?如不能,原因是什么?
DELETE
FROM Course
WHERE Course_name='古代汉语'

不能。DELETE 语句与 REFERENCE 约束"FK_StudentGrade_Course"冲突。表StudentGrade与表Course外键连接
如果想要解决可以选择删除此外键关系再执行

6.删除trigger_ course触发器。

DROP TRIGGER trigger_course

三、实验小结

1.触发器的主要作用是实现数据的完整性和一致性。如何正确使用触发器?

1.只有创建表的用户才可以在表上创建触发器
2.只能定义在基本表上,不能定义在视图
3.同一模式下,触发器名必须唯一,且与表名必须在同一模式下。
4.创建的语法结构必须正确

2.触发器可以划分为几种类别?分别是什么?

触发器可以划分为三种:DML触发器、DDL触发器、登录触发器。
DML分为:after触发器(insert触发器、update触发器、 delete触发器)和instead of 触发器。

  1. 此次实验中得到的哪些经验教训、疑难问题?有什么心得或总结?