for insert触发器执行时出错,insert语句如何还能执行成功

for insert触发器执行时出错,insert语句怎么还能执行成功?
不应该是触发器执行成功才算是SQL语句执行成功了么?
------解决思路----------------------
对,触发器失败会回滚事务
------解决思路----------------------
引用:
不应该是触发器执行成功才算是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

------解决思路----------------------
本帖最后由 roy_88 于 2014-11-03 15:33:26 编辑
触发器里出错有没有回滚事务
如:

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失败了,但是数据还是写入成功了?
------解决思路----------------------
引用:
Quote: 引用:

1、出错会自己回滚,不需要自己写
2、能自己回滚


可是for insert的触发器出错了 但是insert语句执行成功了!

好奇葩,求你的表求你的触发器
我这边尝试重现~
------解决思路----------------------
这要看楼主怎么写了,如果是在插入前触发触发器,可以自动回滚,在插入后触发触发器,需要手动回滚。
after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。