触发器别忘了用游标
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)