数据库触发器与事务

2008.10.13 / 标签: ,,,,,,, / 分类: 未分类

当对数据库中的一张表进行操作且同时又要对与之相关的其他表的数据进行修改时,要如何操作呢?一种方法是写出每一个操作的SQL语句,然后逐一执行。但是,如果碰到银行转账这种业务,我们需要先从A帐户扣钱,然后给B帐户加钱。若A帐户扣钱成功但是B帐户加钱失败,我们还得再多写一条SQL用以在失败的时候再把A的钱给加上。这样太麻烦而且需要我们在底层写很多数据库操作代码,容易出错也不安全。
此时就可以用触发器与事务来处理,当对A帐户进行修改时自动触发执行对B帐户的修改,并且当其中任何一个操作失败时,事务会自动回滚,取消之前所有的操作,这样就无形的减少了不少代码及安全隐患。
我所做的项目就有这样的一个需要:有一个文章表和一个文章类别表,文章类别表中有个字段用于存储该类别下的文章数量。所以,增加或删除一篇文章同时需要对类别表进行修改,只需要使用如下的代码创建一个触发器即可。

 
  1. CREATE TRIGGER trig_Article_Ins–开始创建触发器
  2. ON dbo.blog_Article–指明要对哪个表创建
  3. FOR INSERT–创建INSERT类型的触发器
  4. AS
  5. BEGIN TRANSACTION–开始事务
  6.     DECLARE @cateId int,@errorSum int–声明变量,分别用于存储类别ID和错误统计
  7.     SET @errorSum = 0–错误统计初值为0
  8.     SELECT @cateId=log_CateID FROM inserted–查到新插入的文章的类别ID
  9.     SET @errorSum=@errorSum+@@ERROR–累计错误
  10.     UPDATE blog_Category SET cate_Count=cate_Count+1 WHERE cate_ID=@cateId–对相应的表进行更新
  11.     SET @errorSum=@errorSum+@@ERROR–累计错误
  12.     
  13.     IF @errorSum <> 0–若执行期间出现错误则回滚,否则提交事务
  14.         BEGIN
  15.             print ‘创建失败,回滚事务!’
  16.             ROLLBACK TRANSACTION
  17.         END
  18.     ELSE
  19.         BEGIN
  20.             print ‘创建成功,提交事务!’
  21.             COMMIT TRANSACTION
  22.         END
  23. GO

 

另外,使用这个还有另外一个原因:好久没有写过这些东西了,该练练手了。所以,今天在编写这个触发器的时候还小查了一下帮助手册。

 

sql server 触发器

2008.07.20 / 标签: ,,,, / 分类: 未分类
Sofa

1触发器是在对表进行插入、更新和删除操作时自动执行的存储过程.触发器通常用于强制业务规则. 2触发器还是一个特殊的事务单元,当出现错误时,可以执行 rollback transaction 回滚撤销操作 3触发器一般都需要使用临时表:delcted表和inserted表,它们存放了被删除或插入的记录行副本 4触发器从触发的条件来分,包括以下类型. INSERT触发器,当试图向表中插入数据时,将执行INSERT 触发器.这种触发器可以确保插入表中的数据是有效的. UPDATE触发器:当对表执行更新操作时,将执行UPDATE触发器 这种触发器是在修改表中的记录行或修改某列数据时触发执行 DELETE触发器:当从表中删除数据时,将执行DELETE触发器创建一个UPDATE触发器

 
  1. if exists (select * from sysobjects where name=’trig_update_transInfo’) 
  2. drop trigger rig_update_transInfo
  3. go
  4. create trigger rig_update_transInfo
  5. on transInfo 
  6. for UPDATE
  7. as if UPDATE(transDate)
  8. begin
  9. print ‘交易失败’
  10. raiserror(‘安全警告:交易日期不能修改,由系统自动产生’,16,1)
  11. rollback transaction
  12. end
  13. go
  14. //测试触发器
  15. Update transInfo set transDate=’2000-1-1’
  16. go

 

无觅相关文章插件,快速提升流量