数据库触发器与事务

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

 

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

 

事务、索引和视图

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

1数据库事务具有如下特性
原子性
一致性
隔离性
持久性
以上4个特性被成为ACID特性
2事务可以分为 如下类型
显式事务
隐性事务
自动提交事务
3如何创建事务
开始事务 begin transaction
提交事务 commit transaction
回滚事务 rollback transaction
4建立索引有助于快速检索数据,索引分为唯一索引、主键索引、聚集索引和非聚集索引
例如:非聚集索引 creat nonclustered index IX_stuMarks_writtenExam
On stuMarks(writtenExam)
5聚居索引决定表中数据的存储顺序.一个表只能有一个聚集索引,聚集索引决定表中的物理存储顺序.非聚集索引指定表的逻辑顺序.因此,一个表可以有多个非聚集索引(最多249个).
6视图是另一种查看数据库中一个过多个表中数据的方法.视图是一种虚拟表,通常是执行查询的结果而创建的,视图充当对查询中指定的表的筛选器
7修改了视图中的记录,会相应的修改数据库中表的记录

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