• 触发器别忘了用游标


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

    [sql] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    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  
  • 相关阅读:
    Python全栈之路Day19
    Python全栈之路Day20
    Python全栈之路Day21
    子元素应该margin-top为何会影响父元素【转】
    HTML5的效果网站demo
    用CSS让字体在一行内显示不换行
    jQuery获得页面元素的绝对/相对位置
    DIV垂直/水平居中2(DIV宽度和高度是动态的)
    Jquery常用方法
    关于JS正则表达式
  • 原文地址:https://www.cnblogs.com/Alex80/p/5736971.html
Copyright © 2020-2023  润新知