目录
- 实验十一 触发器的使用
- 一、实验目的
- 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 触发器。
- 此次实验中得到的哪些经验教训、疑难问题?有什么心得或总结?