博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
触发器别忘了用游标
阅读量:7093 次
发布时间:2019-06-28

本文共 2199 字,大约阅读时间需要 7 分钟。

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

 

[sql]   
 
 
  1. USE [BasicDataSystem]  
  2. GO  
  3. /****** Object:  Trigger [dbo].[TR_Class_US]    Script Date: 12/12/2012 09:32:22 ******/  
  4. SET ANSI_NULLS ON  
  5. GO  
  6.   
  7. SET QUOTED_IDENTIFIER ON  
  8. GO  
  9. -- =============================================  
  10. -- Author:      选课小组  
  11. -- Create date: 2012年12月10日  
  12. -- Description: 假删除操作。IsAvailable属性由是改为否触发器。同时处理和班级相关的表信息。  
  13. -- =============================================  
  14.   
  15. ALTER trigger [dbo].[TR_Class_US] on [dbo].[TB_Class]  
  16. AFTER UPDATE  
  17. AS  
  18. DECLARE   
  19. @classID VARCHAR(50),  
  20. @isAva char(2),  
  21. @StudentID VARCHAR(50)  
  22.   
  23. BEGIN   
  24.     select @isAva=isAvailable from inserted  --选择字段值  
  25.     if (Update(isAvailable) and @isAva = '否')   --更改字段值为否  
  26.         begin         
  27.             SELECT @classID=classID From DELETED   -- 选择更改的班级号  
  28.             --添加更改前的信息到历史记录表  
  29.             insert into TBH_Class(ClassId,ClassCode,ClassName,[Description],GradeCode,GradeName,DepartmentCode,DepartmentName,CollegeCode,CollegeName,ActionContent,ActionReason,ActionType)   
  30.                 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  
  31.                 from VB_ClassAllInfo m,TB_Class n where m.ClassId=@classID and n.ClassId=@classID     
  32.             --更新学生班级表中的标识字段为否  
  33.             Update TBR_StuClassLink SET isAvailable = '否' WHERE classID = @classID  
  34.               
  35.             --更新班级和专业关系表中的标识字段为否  
  36.             Update TBR_ClassDepLink set IsAvailable='否'where ClassId=@classID  
  37.               
  38.             --更新班级和年级关系表中的标识字段为否  
  39.             Update TBR_ClassGradeLink set IsAvailable='否' where ClassId=@classID  
  40.               
  41.             --更新学生表中的附加信息  
  42.             Update TB_Student set ActionType='标识删除',ActionContent='撤销学生信息',ActionReason='班级被撤销' where StudentId in (select StudentId from TBR_StuClassLink where classID = @classID and isAvailable = '否')  
  43.               
  44.             --更新学生表中标识字段为否(需要触发学生的多条记录,用游标操作)  
  45.             --声明游标(集合为删除班级下的学生ID)  
  46.             DECLARE StuCursor CURSOR FOR    
  47.             select StudentId from TBR_StuClassLink where classID = @classID and isAvailable = '否'  
  48.              --打开游标  
  49.             open StuCursor   
  50.             FETCH NEXT FROM StuCursor INTO @StudentID   --给变量赋初始值  
  51.             WHILE @@FETCH_STATUS=0 --语句执行成功  
  52.                 begin  
  53.                 --更新学生表中的记录  
  54.                 Update TB_Student SET isAvailable = '否' WHERE StudentId=@StudentID  
  55.                 FETCH NEXT FROM StuCursor INTO @StudentID  
  56.                 end  
  57.             --关闭并释放游标  
  58.             CLOSE StuCursor    
  59.             DEALLOCATE StuCursor  
  60.         end  
  61. END  
  62.   
  63. GO  

转载地址:http://jfiql.baihongyu.com/

你可能感兴趣的文章
博客的第一篇文章!祝福我吧!
查看>>
Hyper-V centos 全屏
查看>>
LAMP平台的搭建和网站的防盗链
查看>>
iptables详解
查看>>
【遇到问题】v$session_longops视图
查看>>
LAMP - MySQL的root密码重置
查看>>
asp连接access,增删改查
查看>>
Golang 获取系统信息
查看>>
WAMP Server 和IIS 7在Windows中同时运行,更改 Wampserver默认端口的解决方法
查看>>
Double数字转换工具类
查看>>
一张表里的多个字段值 取自 字典表里的text 的查询
查看>>
golang tcp socket
查看>>
狗日的开源软件许可证
查看>>
Kele UI 后台进程列表
查看>>
Windows IQ 测试
查看>>
本贴给C++初学者一个学习参考
查看>>
以应用为中心的无服务器PaaS将成主流
查看>>
css reset
查看>>
命令注入写webshell
查看>>
特么的程序员励志故事(小IT职员在北京5年买了500W的房子)
查看>>