触发器别忘了用游标

update触发器只会被update触发一次,无论更新的记录数是多少,同理Delete触发器也是一样,对于处理集合性的数据,sql往往是同时处理的,没有按照先后顺序,这样相应的触发器就不会一一触发。这里就需要用游标处理,我用我现在正在做的一个项目的触发器代码供参考:

 

USE [BasicDataSystem]
GO
/****** Object:  Trigger [dbo].[TR_Class_US]    Script Date: 12/12/2012 09:32:22 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		选课小组
-- Create date: 2012年12月10日
-- Description:	假删除操作。IsAvailable属性由是改为否触发器。同时处理和班级相关的表信息。
-- =============================================

ALTER trigger [dbo].[TR_Class_US] on [dbo].[TB_Class]
AFTER UPDATE
AS
DECLARE 
@classID VARCHAR(50),
@isAva char(2),
@StudentID VARCHAR(50)

BEGIN 
	select @isAva=isAvailable from inserted  --选择字段值
	if (Update(isAvailable) and @isAva = '否')   --更改字段值为否
		begin		
			SELECT @classID=classID From DELETED   -- 选择更改的班级号
			--添加更改前的信息到历史记录表
			insert into TBH_Class(ClassId,ClassCode,ClassName,[Description],GradeCode,GradeName,DepartmentCode,DepartmentName,CollegeCode,CollegeName,ActionContent,ActionReason,ActionType) 
				Select m.ClassId,m.ClassCode,m.ClassName,m.[Description],m.GradeCode,m.GradeName,m.DepartmentCode,m.DepartmentName,m.CollegeCode,m.CollegeName,n.ActionContent,n.ActionReason,n.ActionType
				from VB_ClassAllInfo m,TB_Class n where m.ClassId=@classID and n.ClassId=@classID	
			--更新学生班级表中的标识字段为否
			Update TBR_StuClassLink SET isAvailable = '否' WHERE classID = @classID
			
			--更新班级和专业关系表中的标识字段为否
			Update TBR_ClassDepLink set IsAvailable='否'where ClassId=@classID
			
			--更新班级和年级关系表中的标识字段为否
			Update TBR_ClassGradeLink set IsAvailable='否' where ClassId=@classID
			
			--更新学生表中的附加信息
			Update TB_Student set ActionType='标识删除',ActionContent='撤销学生信息',ActionReason='班级被撤销' where StudentId in (select StudentId from TBR_StuClassLink where classID = @classID and isAvailable = '否')
			
			--更新学生表中标识字段为否(需要触发学生的多条记录,用游标操作)
			--声明游标(集合为删除班级下的学生ID)
			DECLARE StuCursor CURSOR FOR  
			select StudentId from TBR_StuClassLink where classID = @classID and isAvailable = '否'
			 --打开游标
			open StuCursor 
			FETCH NEXT FROM StuCursor INTO @StudentID   --给变量赋初始值
			WHILE @@FETCH_STATUS=0 --语句执行成功
				begin
				--更新学生表中的记录
				Update TB_Student SET isAvailable = '否' WHERE StudentId=@StudentID
				FETCH NEXT FROM StuCursor INTO @StudentID
				end
			--关闭并释放游标
			CLOSE StuCursor  
			DEALLOCATE StuCursor
		end
END

GO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值