我在rkdxm这个表上建了个触发器(整个数据库就这一个触发器):
CREATE TRIGGER [rkc] ON dbo.rkdxm 
FOR INSERT
NOT for replication
AS
begin
if exists(select 1 from kc a inner join inserted b on a.ypID=b.ypID and a.rkdj=b.rkdj)
  update a set kcsl=a.kcsl+b.sl from kc a inner join inserted b on a.ypID=b.ypID and a.rkdj=b.rkdj
else
  insert into kc(ypID,kcsl,rkdj,xsdj) select ypID,sl,rkdj,xsdj from inserted
end
当rkdxm表里插入一条记录时,查看库存表里是不是有相同的记录,如果有根据这条新插入的记录更改库存表的库存数量,
如果没有在库存表里也插入这条记录。
如果这个触发器正在操作库存表时,别的事务或存储过程还能访问库存表并对库存表进行操作吗?
如果在一种极端情况下,比如这条记录刚插入rkdxm表中,触发器还没启动,就突然停电了,那会不会造出库存表中的数据不正确?
如果真是这样,我在插入rkdxm这个存储过程里建个事务,怎样把这个触发器放到这个事务里?

解决方案 »

  1.   

    在SQL里,一条语句就是一个隐式事务.
    如有可能,在你的触发器里整体建一个事务.即在触发器中begin 后面开始事务,在end之前提交事务.
    突然断电这种事情不要去考虑它.那是硬件配置上的事情.
      

  2.   

    MSDN  了解 DML 触发器 
    当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。
    如果掉电的话, 存储过程将会被undo。则触发器的处理也会被undo.