当对数据库中的一张表进行操作且同时又要对与之相关的其他表的数据进行修改时,要如何操作呢?一种方法是写出每一个操作的SQL语句,然后逐一执行。但是,如果碰到银行转账这种业务,我们需要先从A帐户扣钱,然后给B帐户加钱。若A帐户扣钱成功但是B帐户加钱失败,我们还得再多写一条SQL用以在失败的时候再把A的钱给加上。这样太麻烦而且需要我们在底层写很多数据库操作代码,容易出错也不安全。
此时就可以用触发器与事务来处理,当对A帐户进行修改时自动触发执行对B帐户的修改,并且当其中任何一个操作失败时,事务会自动回滚,取消之前所有的操作,这样就无形的减少了不少代码及安全隐患。
我所做的项目就有这样的一个需要:有一个文章表和一个文章类别表,文章类别表中有个字段用于存储该类别下的文章数量。所以,增加或删除一篇文章同时需要对类别表进行修改,只需要使用如下的代码创建一个触发器即可。
- CREATE TRIGGER trig_Article_Ins–开始创建触发器
- ON dbo.blog_Article–指明要对哪个表创建
- FOR INSERT–创建INSERT类型的触发器
- AS
- BEGIN TRANSACTION–开始事务
- DECLARE @cateId int,@errorSum int–声明变量,分别用于存储类别ID和错误统计
- SET @errorSum = 0–错误统计初值为0
- SELECT @cateId=log_CateID FROM inserted–查到新插入的文章的类别ID
- SET @errorSum=@errorSum+@@ERROR–累计错误
- UPDATE blog_Category SET cate_Count=cate_Count+1 WHERE cate_ID=@cateId–对相应的表进行更新
- SET @errorSum=@errorSum+@@ERROR–累计错误
- IF @errorSum <> 0–若执行期间出现错误则回滚,否则提交事务
- BEGIN
- print ‘创建失败,回滚事务!’
- ROLLBACK TRANSACTION
- END
- ELSE
- BEGIN
- print ‘创建成功,提交事务!’
- COMMIT TRANSACTION
- END
- GO
CREATE TRIGGER trig_Article_Ins--开始创建触发器ON dbo.blog_Article--指明要对哪个表创建FOR INSERT--创建INSERT类型的触发器ASBEGIN TRANSACTION--开始事务 DECLARE @cateId int,@errorSum int--声明变量,分别用于存储类别ID和错误统计 SET @errorSum = 0--错误统计初值为0 SELECT @cateId=log_CateID FROM inserted--查到新插入的文章的类别ID SET @errorSum=@errorSum+@@ERROR--累计错误 UPDATE blog_Category SET cate_Count=cate_Count+1 WHERE cate_ID=@cateId--对相应的表进行更新 SET @errorSum=@errorSum+@@ERROR--累计错误 IF @errorSum <> 0--若执行期间出现错误则回滚,否则提交事务 BEGIN print '创建失败,回滚事务!' ROLLBACK TRANSACTION END ELSE BEGIN print '创建成功,提交事务!' COMMIT TRANSACTION ENDGO
另外,使用这个还有另外一个原因:好久没有写过这些东西了,该练练手了。所以,今天在编写这个触发器的时候还小查了一下帮助手册。