SQL触发器的示例,包括Inserted,Deleted.Updated.

刚才在CSDN上回答了一个网友的提问,做了一个触发器的例子,觉得程序还比较清晰易懂。放上来……
有意思的是,发布时选代码语言居然没有SQL语言可以选,只能选C#语言了。

先说有一下CSDN网友要解决的问题:
我有两个表:
表1:exam_QuestionName
字段:QuestionCode  TypeCode  QuestionName  QuestionNum(int)

表2:exam_QuestionType
字段:TypeCode  SubjectCode  TypeName  QuestionNum(int)

要求:1.表1的QuestionNum字段值+1的时候,表2的QuestionNum也+1
    2.表1的QuestionNum字段值-1的时候,表2的QuestionNum也-1
    3.在SQLSever2000中实现
请大家帮帮我,谢谢!
这是它的直接请求,交流之后我得出结论大概是这样的:
  • 两个表主键分别为QuestionCode,TypeCode;
  • 表1的TypeCode是外键,对应主键为表2的TypeCode;
  • 表1可能表示某一个问题对应的计数,而更新一个问题的计数则需要更新对应整个类型的计数;
  • 不止是更新,其实插入或者删除也需要相应在表2中进行相应的更新;
  • 不止是+1/-1操作,应该处理任意大小值增减的操作。尽管这种操作不太可能发生,但有利于维护数据完整性。
这是相应触发器的创建脚本,SQL2005/开发版测试成功。
  1. set ANSI_NULLS ON
  2. set QUOTED_IDENTIFIER ON
  3. go

  4. -- =============================================
  5. -- Author:        brallow
  6. -- Create date: 2008-10-17
  7. -- Description:    Trigger Example For CSDN
  8. -- =============================================
  9. CREATE TRIGGER  [QUAutoCalc]
  10.    ON  [dbo].[exam_QuestionName]
  11.    AFTER INSERT,DELETE,UPDATE
  12. AS 
  13. BEGIN
  14.     -- SET NOCOUNT ON added to prevent extra result sets from
  15.     -- interfering with SELECT statements.
  16.     SET NOCOUNT ON;
  17.     --定义变量 分别用于存放受影响的 QuestionCode,TypeCode,QuestionNum
  1.     Declare @eQuestionCode as varchar(10);
  2.     Declare @eTypeCode as varchar(10);
  3.     Declare @eQuestionNum as int;  
  4.     --处理删除的数据
  5.     --取出已删除的数据的QuestionCode,TypeCode,QuestionNum
  6.     select 
  7.     @eQuestionCode= QuestionCode,
  8.     @eTypeCode = TypeCode,
  9.     @eQuestionNum=QuestionNum 
  10.     from Deleted;
  11.     --判断取出数据是否有效
  12.     if(@eQuestionCode is not Null and @eTypeCode is not Null)
  13.         begin
  14.         --更新[表2]中 TypeCode与之对应的记录,使QuestionNum减少相应的数值
  15.         update exam_QuestionType
  16.         set QuestionNum = QuestionNum - @eQuestionNum
  17.         where TypeCode = @eTypeCode;
  18.     end
  19.     --清空数据
  20.     set @eQuestionCode = Null;
  21.     set @eTypeCode = Null;
  22.     set @eQuestionNum = Null;
  23.     --处理插入的数据    
  24.     select 
  25.     @eQuestionCode= QuestionCode,
  26.     @eTypeCode = TypeCode,
  27.     @eQuestionNum=QuestionNum 
  28.     from Inserted;
  29.     if(@eQuestionCode is not Null and @eTypeCode is not Null)
  30.         begin
  31.         update exam_QuestionType
  32.         set QuestionNum = QuestionNum + @eQuestionNum
  33.         where TypeCode = @eTypeCode;
  34.     end
  35. END
下面有网友留言讨论触发器是否应当及可以使用,我想这又是另外一个话题了,呵呵。当你觉得用起来方便和舒服的时候,那种感觉其实挺不错。

附原问题地址:
http://topic.csdn.net/u/20081016/21/76f5d44f-0338-4f02-841c-b62cd8dde0c8.html
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值