刚才在优快云上回答了一个网友的提问,做了一个触发器的例子,觉得程序还比较清晰易懂。放上来……
有意思的是,发布时选代码语言居然没有SQL语言可以选,只能选C#语言了。
先说有一下优快云网友要解决的问题:
下面有网友留言讨论触发器是否应当及可以使用,我想这又是另外一个话题了,呵呵。当你觉得用起来方便和舒服的时候,那种感觉其实挺不错。
附原问题地址:
http://topic.youkuaiyun.com/u/20081016/21/76f5d44f-0338-4f02-841c-b62cd8dde0c8.html
有意思的是,发布时选代码语言居然没有SQL语言可以选,只能选C#语言了。
先说有一下优快云网友要解决的问题:
我有两个表:这是它的直接请求,交流之后我得出结论大概是这样的:
表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操作,应该处理任意大小值增减的操作。尽管这种操作不太可能发生,但有利于维护数据完整性。
- set ANSI_NULLS ON
- set QUOTED_IDENTIFIER ON
- go
- -- =============================================
- -- Author: brallow
- -- Create date: 2008-10-17
- -- Description: Trigger Example For 优快云
- -- =============================================
- CREATE TRIGGER [QUAutoCalc]
- ON [dbo].[exam_QuestionName]
- AFTER INSERT,DELETE,UPDATE
- AS
- BEGIN
- -- SET NOCOUNT ON added to prevent extra result sets from
- -- interfering with SELECT statements.
- SET NOCOUNT ON;
- --定义变量 分别用于存放受影响的 QuestionCode,TypeCode,QuestionNum
- Declare @eQuestionCode as varchar(10);
- Declare @eTypeCode as varchar(10);
- Declare @eQuestionNum as int;
- --处理删除的数据
- --取出已删除的数据的QuestionCode,TypeCode,QuestionNum
- select
- @eQuestionCode= QuestionCode,
- @eTypeCode = TypeCode,
- @eQuestionNum=QuestionNum
- from Deleted;
- --判断取出数据是否有效
- if(@eQuestionCode is not Null and @eTypeCode is not Null)
- begin
- --更新[表2]中 TypeCode与之对应的记录,使QuestionNum减少相应的数值
- update exam_QuestionType
- set QuestionNum = QuestionNum - @eQuestionNum
- where TypeCode = @eTypeCode;
- end
- --清空数据
- set @eQuestionCode = Null;
- set @eTypeCode = Null;
- set @eQuestionNum = Null;
- --处理插入的数据
- select
- @eQuestionCode= QuestionCode,
- @eTypeCode = TypeCode,
- @eQuestionNum=QuestionNum
- from Inserted;
- if(@eQuestionCode is not Null and @eTypeCode is not Null)
- begin
- update exam_QuestionType
- set QuestionNum = QuestionNum + @eQuestionNum
- where TypeCode = @eTypeCode;
- end
- END
附原问题地址:
http://topic.youkuaiyun.com/u/20081016/21/76f5d44f-0338-4f02-841c-b62cd8dde0c8.html