SQL Server实验-触发器的使用(设计触发器,确保表Avg_sno中数据与表SC中数据的一致性)

一.实验分析

题目:表SC(Sno,Cno,Grade)用来存放学生成绩,表Avg_sno(Sno,Avg_grade)用来存放学生的平均成绩,设计触发器,确保表Avg_sno中数据与表SC中数据的一致性。

题目分析:

        ①.需新建一张表Avg_sno表

        ②.新建Avg_sno表并初始同步原SC表中的内容

        ③.编写触发器

        ④.验证触发器

附: 初始Sno表参考:

Sno为学生学号,Cno为课程号,Grade为课程成绩

 


二.代码编写

        1.创建Avg_sno表

此处为了方便,create时就不考虑完整性的定义了。

         2.同步Avg_sno表数据

由于创建Avg_sno表之前SC表已存在,所以需先进行数据同步。使用INSERT语句可以实现

INSERT
INTO Avg_sno(Sno,Avg_grade)
SELECT Sno,AVG(Grade) Avg_grade
FROM SC
GROUP BY Sno

        3.编写触发器

编写前分析:本次应该为SC表编写触发器,当SC表中的数据发生变化时,Avg_sno表中数据应该同步变化。

可能影响SC表中数据的操作由有:INSERT/UPDATE/DELETE 。

(本人在写该博客时也是第一次学习触发器。编写的思路是为这三个操作分别编写三个触发器来实现数据一致性。若你想到了更好的方法,欢迎交流)

UPDATE和DELETE触发器的逻辑差不多,因此本文只以编写INSERTUPDATE触发器为例

        ①.UPDATE触发器编写

        只考虑功能实现,不考虑性能优化

USE wlw2020(这里换成你自己的数据库名称)
CREATE TRIGGER UPDATE_TEST(为触发器起名为UPDATE_TEST)
ON SC(换成自己的表的名称,这里为SC表)
AFTER UPDATE (以AFTER触发为例)
AS
BEGIN
		DECLARE @upGrade SMALLINT;
		DECLARE @upSno CHAR(9);
		DECLARE @newAvg SMALLINT;
		SELECT @upSno = Sno FROM inserted
		SELECT @upGrade = AVG(Grade) FROM SC GROUP BY Sno
		SELECT @newAvg = AVG(Grade) FROM SC WHERE Sno = @upSno
		UPDATE Avg_sno
		SET Avg_grade = @newAvg
		WHERE Sno = @upSno
	END
GO

        触发器验证: 

        以修改201215122号学生为例,修改前平均成绩为(90+80)/2=85

        现修改其Cno=2的课程成绩为100,观察两表数据变化

        可看到Avg_sno表中平均成绩已同步变为(100+80)/2=90,说明触发器功能正常。

        ②.INSERT触发器编写

        提供一个针对题目编写INSERT(AFTER)触发器的思路。

        同样只考虑功能实现,不考虑性能优化。

USE wlw2020(换成你的数据库名称) 
GO
CREATE TRIGGER INSERT_TEST(创建一个名为INSERT_TEST的触发器)
ON SC(换成你的表名称,这里以SC表为例)
AFTER INSERT (以AFTER触发为例)
AS
	BEGIN
		DECLARE @upGrade SMALLINT;
		DECLARE @upSno CHAR(9);
		DECLARE @newAvg SMALLINT;
		DECLARE @flagCount SMALLINT; 
		SELECT @upSno = Sno FROM inserted
		SELECT @upGrade = AVG(Grade) FROM SC GROUP BY Sno
		SELECT @newAvg = AVG(Grade) FROM SC WHERE Sno = @upSno
		SELECT @flagCount = COUNT(Sno) FROM SC WHERE Sno = @upSno
		IF(@flagCount = '1')
			BEGIN
				INSERT
				INTO Avg_sno(Sno,Avg_grade)
				VALUES(@upSno,@upGrade)
			END
		ELSE
			BEGIN
				UPDATE Avg_sno
				SET Avg_grade = @newAvg
				WHERE Sno = @upSno
			END
	END

                 触发器验证:

                仍然以201215122号学生为例,修改前其平均成绩为(100+80)/2 = 90

         现向SC表中插入一条记录

INSERT
INTO SC
VALUES(201215122,1,60)

新INSERT的记录Grade为60,因此新平均成绩应该为(60+100+80)/3=80,实际Avg_sno表中的数据也已同步为80,触发器工作正常。 

 


三.小结

        触发器的重点需理解触发时机 Instead of / After / For 的机制和对应的Inserted表和Deleted的运用。其次需掌握SQL Server中临时变量的定义和使用。

实验5.1 存储过程的建立与使用 一、实验目的 理解存储过程的概念、作用、建立和调用方法。 二、实验原理 使用CREATE PROCEDURE语句创建存储过程,ALTER PROCEDURE语句修改存储过程,DROP PROCEDURE语句删除存储过程,存储过程有不带参数的、有带输入参数的、有带输出参数(output)的,还可以有带返回值的。创建好的存储过程可以使用EXEC procedure_name语句执行。 实验5.2 触发器的建立与使用 一、实验目的 理解触发器的概念和作用;了解触发器的分类及触发条件;掌握触发器的定义及应用。 二、实验原理 1、 使用CREATE TRIGGER语句定义触发器,ALTER TRIGGER语句修改触发器,DROP TRIGGER语句删除触发器。 2、 触发器分AFTER/FOR和INSTEAD OF两种类型:AFTER/FOR类型的触发器是在相应的触发语句(insert、delete、update)执行完后被触发的。如果触发语句对应的上有完整性约束,这些完整性约束必须不违背时,相应的触发语句才能执行,然后才能触发对应的AFTER/FOR类型的触发器。INSTEAD OF类型的触发器会在触发语句(insert、delete、update)执行之前被触发,并取代相应的触发语句。 3、 在或视图上,每个INSERT、UPDATE或DELETE语句只能创建一个INSTEAD OF类型的触发器,无法为有外键约束且指定为级联删除或级联修改的创建DELETE或UPDATE语句上的INSTEAD OF 类型的触发器SQL SERVER为每个触发器都创建了两个临时INSERTED和DELETED,这两个的逻辑结构与被触发器作用的一样,用户可以读取这两个的内容,但不能对它们进行修改,触发器执行完后,这两个也会自动删除。当执行INSERT时,INSERTED保存要向插入的所有行;当执行DELETE时,DELETED保存要从删除的所有行;当执行UPDATE时,修改前的行保存在DELETED,修改后的行保存在INSERTED行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值