for insert触发器执行时出错,insert语句怎么还能执行成功?

newlovedew 2014-11-03 03:17:19
不应该是触发器执行成功才算是SQL语句执行成功了么?
...全文
513 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andrewdavid 2016-08-22
  • 打赏
  • 举报
回复
引用 楼主 newlovedew 的回复:
不应该是触发器执行成功才算是SQL语句执行成功了么?
楼主找出原因来了吗?
ffshao 2014-11-05
  • 打赏
  • 举报
回复
这要看楼主怎么写了,如果是在插入前触发触发器,可以自动回滚,在插入后触发触发器,需要手动回滚。 after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。
中国风 2014-11-04
  • 打赏
  • 举报
回复
引用 5 楼 ky_min 的回复:
1、出错会自己回滚,不需要自己写 2、能自己回滚
在SQL2000时记得可以自动回滚,之后的版本要看触发器的出错阶别和逻辑而定;如以上例子 新增A表时,同时新增B表,在触发器里抛错时,B表失败,A表会成功
卖水果的net 版主 2014-11-04
  • 打赏
  • 举报
回复
LZ 遇到 insert 时,TR失败了,但是数据还是写入成功了?
还在加载中灬 2014-11-04
  • 打赏
  • 举报
回复
1、出错会自己回滚,不需要自己写 2、能自己回滚
以学习为目的 2014-11-04
  • 打赏
  • 举报
回复
引用 9 楼 newlovedew 的回复:
[quote=引用 5 楼 ky_min 的回复:] 1、出错会自己回滚,不需要自己写 2、能自己回滚
可是for insert的触发器出错了 但是insert语句执行成功了![/quote] 这么理解吧,用for insert触发器,是指当执行了插入操作之后,然后执行as后面的语句。如果想取消插入操作,需要事务回滚。
中国风 2014-11-04
  • 打赏
  • 举报
回复
引用 9 楼 newlovedew 的回复:
[quote=引用 5 楼 ky_min 的回复:] 1、出错会自己回滚,不需要自己写 2、能自己回滚
可是for insert的触发器出错了 但是insert语句执行成功了![/quote] 楼主是这类触发器没有加上"ROLLBACK TRAN"会出错这样情况。
USE tempdb
GO
 
CREATE TABLE T1(ID INT);

 go
CREATE TRIGGER tr_T1_insert ON T1 FOR INSERT
AS
 RAISERROR (N'失败',16,1)
go
INSERT INTO t1 VALUES(1);--成功

go
SELECT * FROM T1
/*
ID
1
*/
go
DROP TABLE t1
还在加载中灬 2014-11-04
  • 打赏
  • 举报
回复
引用 9 楼 newlovedew 的回复:
[quote=引用 5 楼 ky_min 的回复:] 1、出错会自己回滚,不需要自己写 2、能自己回滚
可是for insert的触发器出错了 但是insert语句执行成功了![/quote] 好奇葩,求你的表求你的触发器 我这边尝试重现~
newlovedew 2014-11-04
  • 打赏
  • 举报
回复
引用 5 楼 ky_min 的回复:
1、出错会自己回滚,不需要自己写 2、能自己回滚
可是for insert的触发器出错了 但是insert语句执行成功了!
newlovedew 2014-11-04
  • 打赏
  • 举报
回复
引用 6 楼 wmxcn2000 的回复:
LZ 遇到 insert 时,TR失败了,但是数据还是写入成功了?
对 就是这个情况 您知道原因么?
newlovedew 2014-11-03
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
触发器里出错有没有回滚事务 如:
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是执行表操作再执行触发器
额 我是刚刚学习触发器 根据您的回答 我的理解是: (1)如果写成 for insert,那么回滚的语句要自己写? (2)如果写成INSTEAD OF INSERT,就能自己回滚? 我自己去试下也
中国风 2014-11-03
  • 打赏
  • 举报
回复
触发器里出错有没有回滚事务
如:

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是执行表操作再执行触发器
中国风 2014-11-03
  • 打赏
  • 举报
回复
引用 楼主 newlovedew 的回复:
不应该是触发器执行成功才算是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
中国风 2014-11-03
  • 打赏
  • 举报
回复
对,触发器失败会回滚事务

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧