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、rollback回滚的事务,是从begin tran开始的,不会回滚触发器操作前的insert操作
#2
2、这个begin tran是不是在程序中对此INSERT发生的数据集的指定。
还有就是第三个问题,触发器中的INSERTED是不是只可能有一条记录,就是说,触发器是不是在每INSERT一条记录便触发一次。
还有就是第三个问题,触发器中的INSERTED是不是只可能有一条记录,就是说,触发器是不是在每INSERT一条记录便触发一次。
#3
还有第一个,就是现在的这个触发器有可能会造成错误数据的可能,因为只对@@ERROR判断了一次,对吗?
#4
分别对三步设置一个变量,把每一步的@error值赋予一个变量,最后再对这3个变量判断
#5
rollback回滚的包括insert的内容(不仅仅是触发器中的操作)
insert不一定是一条记录,可以是多条记录的插入
insert不一定是一条记录,可以是多条记录的插入
#6
接分,告诉你。
#1
1、你三条语句要执行,就要对@@error判断三次
2、rollback回滚的事务,是从begin tran开始的,不会回滚触发器操作前的insert操作
2、rollback回滚的事务,是从begin tran开始的,不会回滚触发器操作前的insert操作
#2
2、这个begin tran是不是在程序中对此INSERT发生的数据集的指定。
还有就是第三个问题,触发器中的INSERTED是不是只可能有一条记录,就是说,触发器是不是在每INSERT一条记录便触发一次。
还有就是第三个问题,触发器中的INSERTED是不是只可能有一条记录,就是说,触发器是不是在每INSERT一条记录便触发一次。
#3
还有第一个,就是现在的这个触发器有可能会造成错误数据的可能,因为只对@@ERROR判断了一次,对吗?
#4
分别对三步设置一个变量,把每一步的@error值赋予一个变量,最后再对这3个变量判断
#5
rollback回滚的包括insert的内容(不仅仅是触发器中的操作)
insert不一定是一条记录,可以是多条记录的插入
insert不一定是一条记录,可以是多条记录的插入
#6
接分,告诉你。