for insert触发器执行时出错,insert语句如何还能执行成功
for insert触发器执行时出错,insert语句怎么还能执行成功?
不应该是触发器执行成功才算是SQL语句执行成功了么?
------解决思路----------------------
对,触发器失败会回滚事务
------解决思路----------------------
不是做更新操作?
------解决思路----------------------
触发器里出错有没有回滚事务
如:
或者用INSTEAD OF INSERT触发器,先执行触发器成功再处理表数据
for INSERT是执行表操作再执行触发器
------解决思路----------------------
LZ 遇到 insert 时,TR失败了,但是数据还是写入成功了?
------解决思路----------------------
好奇葩,求你的表求你的触发器
我这边尝试重现~
------解决思路----------------------
这要看楼主怎么写了,如果是在插入前触发触发器,可以自动回滚,在插入后触发触发器,需要手动回滚。
after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。
不应该是触发器执行成功才算是SQL语句执行成功了么?
------解决思路----------------------
对,触发器失败会回滚事务
------解决思路----------------------
不是做更新操作?
USE tempdb
GO
CREATE TABLE T1(ID INT);
CREATE TABLE T2(ID INT CHECK (ID%2=1));
go
CREATE TRIGGER tr_T1_insert ON T1 FOR INSERT
AS
INSERT T2(ID) SELECT ID FROM INSERTED
go
INSERT INTO t1 VALUES(1);--成功
go
INSERT INTO t1 VALUES(2);--失败
go
SELECT * FROM T1
SELECT * FROM T2
go
DROP TABLE t1,t2
------解决思路----------------------
触发器里出错有没有回滚事务
如:
USE tempdb
GO
CREATE TABLE T1(ID INT);
go
CREATE TRIGGER tr_T1_insert ON T1
FOR INSERT
AS
RAISERROR (N'失败',16,1)
ROLLBACK TRAN
go
INSERT INTO t1 VALUES(1);--失败
go
SELECT * FROM T1
go
DROP TABLE t1
消息 50000,级别 16,状态 1,过程 tr_T1_insert,第 4 行
失败
消息 3609,级别 16,状态 1,第 1 行
事务在触发器中结束。批处理已中止。
(0 行受影响)
或者用INSTEAD OF INSERT触发器,先执行触发器成功再处理表数据
for INSERT是执行表操作再执行触发器
------解决思路----------------------
LZ 遇到 insert 时,TR失败了,但是数据还是写入成功了?
------解决思路----------------------
好奇葩,求你的表求你的触发器
我这边尝试重现~
------解决思路----------------------
这要看楼主怎么写了,如果是在插入前触发触发器,可以自动回滚,在插入后触发触发器,需要手动回滚。
after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。