首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教,这个触发器、事务回滚

2012-08-27 
请问,这个触发器、事务回滚下面是触发器的一部分代码:If(Select 库存数量 From Deleted)0BeginPrint ‘库存

请问,这个触发器、事务回滚
下面是触发器的一部分代码:

If(Select 库存数量 From Deleted)>0
Begin
  Print ‘库存数量大于零时不能删除此记录’
  Rollback Transaction
End


意思即是如果库存量不为0,就撤销删除操作。

我想问的是关于Rollback Transaction,在事务那一章节,书上说的-------“ROLLBACK只能在一个事务处理内使用(在执行一条BEGIN TRANSACTION 命令之后)。否则,如果前面没有BEGIN TRANSACTION 命令,ROLLBACK不会起作用。”

那此触发器中,并没有表示事务开始的BEGIN TRANSACTION 命令,那怎么能实现回滚呢?

[解决办法]
触发器自动位于触发触发器的那个事务,所以不必也不能在触发器写BEGIN TRANSACTION 命令
一般这段代码应该加return

SQL code
If(Select 库存数量 From Deleted)>0Begin  Print ‘库存数量大于零时不能删除此记录’  Rollback Transaction returnEnd
[解决办法]
SQL code
--触发器内的事务是隐式的--应该保证多条记录不致有错,你那样只是一条记录if exists(select 1 from deleted where 库存数量>0)begin    raiserror('库存数量大于零时不能删除此记录',11,1);    rollback;    return;end
[解决办法]
SQL code
If(Select 库存数量 From Deleted)>0Begin  Print ‘库存数量大于零时不能删除此记录’  Rollback Transaction  ReturnEnd楼上都说完咯
[解决办法]
如果是隐式开启了事务,是可以不写begin tran来作为事务的开端。在开启了SET IMPLICIT_TRANSACTIONS 后,只需要显式回滚或撤销事务即可,不需要begin tran,相关详细信息可以看联机丛书
[解决办法]
SQL code
IF (SELECT 库存数量    FROM   deleted) > 0  BEGIN    PRINT ‘库存数量大于零时不能删除此记录’    ROLLBACK TRANSACTION    RETURN  END--触发器内的事务是隐式的,隐式开启了事务,begin tran可以省略 

热点排行