关于事务的疑问,请高手指点

时间:2021-05-28 04:59:11
我在向一表中插入数据时有一 INSERT触发器,触发器有如下过程:
CREATE TRIGGER [INBACKQCAFTERINSERT] ON dbo.表一 
FOR INSERT
AS
SET NOCOUNT ON
IF NOT EXISTS (SELECT * FROM INSERTED) RETURN
--第一步:
UPDATE 表二 SET  
  更新内容 
WHERE 条件
--第二步:
INSERT INTO 表二 (内容) 
    SELECT FROM INSERTED
--第三步:
UPDATE 表三 SET

IF @@ERROR != 0
BEGIN
  ROLLBACK
  RAISERROR ('错误,', 16, 1)
END
我查了帮助:
当 Microsoft® SQL Server™ 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL 语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。

由于 @@ERROR 在每一条语句执行后被清除并且重置

触发器中是不是有三个语句要执行,程序中IF @@ERROR != 0 是不是只是第三步的执行结果呢,如果是这样,如果第一、二步正确,而第三步错误,那我的@@ERROR也为0,是不是数据就会有错误了,
我还想知道这里的 ROLLBACK 是不是不仅回滚触发器中的数据操作,而且也回滚此触发器所在表的INSERT的插入数据吗?
我能不能定义触发器在INSERT前或者INSERT后触发触发器吗?
触发器中的INSERTED是不是只可能有一条记录,就是说,触发器是不是在第INSERT一条记录便触发一次。
谢谢谢谢高手们了,我是刚刚学习这些的。

6 个解决方案

#1


1、你三条语句要执行,就要对@@error判断三次
2、rollback回滚的事务,是从begin tran开始的,不会回滚触发器操作前的insert操作

#2


2、这个begin tran是不是在程序中对此INSERT发生的数据集的指定。
还有就是第三个问题,触发器中的INSERTED是不是只可能有一条记录,就是说,触发器是不是在每INSERT一条记录便触发一次。

#3


还有第一个,就是现在的这个触发器有可能会造成错误数据的可能,因为只对@@ERROR判断了一次,对吗?

#4


分别对三步设置一个变量,把每一步的@error值赋予一个变量,最后再对这3个变量判断

#5


rollback回滚的包括insert的内容(不仅仅是触发器中的操作)

insert不一定是一条记录,可以是多条记录的插入

#6


接分,告诉你。

#1


1、你三条语句要执行,就要对@@error判断三次
2、rollback回滚的事务,是从begin tran开始的,不会回滚触发器操作前的insert操作

#2


2、这个begin tran是不是在程序中对此INSERT发生的数据集的指定。
还有就是第三个问题,触发器中的INSERTED是不是只可能有一条记录,就是说,触发器是不是在每INSERT一条记录便触发一次。

#3


还有第一个,就是现在的这个触发器有可能会造成错误数据的可能,因为只对@@ERROR判断了一次,对吗?

#4


分别对三步设置一个变量,把每一步的@error值赋予一个变量,最后再对这3个变量判断

#5


rollback回滚的包括insert的内容(不仅仅是触发器中的操作)

insert不一定是一条记录,可以是多条记录的插入

#6


接分,告诉你。