触发器如何才能忽略错误,不产生回滚

时间:2021-09-05 05:04:52
--建测试表
IF OBJECT_ID('test') IS NOT NULL
BEGIN
DROP TABLE test
END
GO
CREATE TABLE [dbo].[test](
[id] [bigint] PRIMARY KEY IDENTITY(1,1) NOT NULL,
[name] [nvarchar](200),
[desc] [nvarchar](50),
) ON [PRIMARY]
GO
--测试触发器
IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[trig_Test_Insert2]'))
BEGIN
DROP TRIGGER [dbo].[trig_Test_Insert2]
END
GO
CREATE TRIGGER [trig_Test_Insert2]
ON [dbo].[test]
FOR INSERT 
AS 
BEGIN
SELECT 1/0
IF @@ERROR<>0
raiserror('执行出错',16,1)
END
GO
--测试语句
INSERT INTO test ([name],[desc]) VALUES ( 'name1', 'desc1' )
SELECT * FROM test t


用了try catch, 也是不行……

18 个解决方案

#1


调存储过程也不行

#2


要求:如果触发器出错, insert 依然成功!

#3


触发器是一个事务,出错了当然回滚,要不回滚的话就不要用触发器

#4


try/catch 后用final试试

#5


先保存一个事务点。。
SAVEPOINT  XXXX

回滚的时候

ROLLBACK [WORK] TO SAVEPOINT xxx

#6


引用 5 楼 fredrickhu 的回复:
先保存一个事务点。。
SAVEPOINT  XXXX
回滚的时候
ROLLBACK [WORK] TO SAVEPOINT xxx


ALTER TRIGGER [trig_Test_Insert2]
ON [dbo].[test]
FOR INSERT 
AS 
BEGIN
SAVEPOINT  XXXX
SELECT 1/0
ROLLBACK [WORK] TO SAVEPOINT xxx
END


这样?
似乎都过不了哦……

#7



SAVEPOINT xxx 

begin try  
...
end try  
begin catch  
  select '执行失败'  
  ROLLBACK [WORK] TO SAVEPOINT xxx
end catch  

--其他代码

#8


引用 7 楼 fredrickhu 的回复:

SAVEPOINT xxx 
begin try  
...
end try  
begin catch  
  select '执行失败'  
  ROLLBACK [WORK] TO SAVEPOINT xxx
end catch  
--其他代码

通不过……
触发器如何才能忽略错误,不产生回滚

#9


引用 3 楼 DBA_Huangzj 的回复:
触发器是一个事务,出错了当然回滚,要不回滚的话就不要用触发器


如果不用触发器, 如何检测数据有了改动?
前提:不能在程序中控制……

#10


sql 版本多少?数据改动了是否“仅记录”?

#11


2008的话,可以用CDC,我已经做好了案例 http://blog.csdn.net/dba_huangzj/article/details/8130448

#12


引用 10 楼 DBA_Huangzj 的回复:
sql 版本多少?数据改动了是否“仅记录”?

2005

#13


触发器如何才能忽略错误,不产生回滚。不过可以换个思路,你为什么要回滚呢?把变动的数据用触发器插入别的表就可以了

#14


引用 13 楼 DBA_Huangzj 的回复:
触发器如何才能忽略错误,不产生回滚。不过可以换个思路,你为什么要回滚呢?把变动的数据用触发器插入别的表就可以了


其实我这个触发器最终要做的事情就是将数据远程插入到其它库的表中……

但即使是在此触发器中将这个数据插入同一库的另一个表中,难道就绝对不会有异常出现吗?


#15


允许在调试、测试过程中有异常,正式运行的话,不应该有很多异常

#16


BEGIN TRANSACTION
SAVE TRAN SP1
begin try  
SELECT 1/0
end try  
begin catch  
  --select '执行失败'  
  ROLLBACK TRAN SP1
end catch  
--SELECT * FROM SYS.objects
COMMIT

#17


引用 16 楼 fredrickhu 的回复:
BEGIN TRANSACTION
SAVE TRAN SP1
begin try  
SELECT 1/0
end try  
begin catch  
  --select '执行失败'  
  ROLLBACK TRAN SP1
end catch  
--SELECT * FROM SYS.objects
COMMIT


触发器如何才能忽略错误,不产生回滚

非常感谢您的热心……
不过我的测试代码很全了, F姐可以测试下再发的。

#18


该回复于2016-01-03 15:24:33被管理员删除

#1


调存储过程也不行

#2


要求:如果触发器出错, insert 依然成功!

#3


触发器是一个事务,出错了当然回滚,要不回滚的话就不要用触发器

#4


try/catch 后用final试试

#5


先保存一个事务点。。
SAVEPOINT  XXXX

回滚的时候

ROLLBACK [WORK] TO SAVEPOINT xxx

#6


引用 5 楼 fredrickhu 的回复:
先保存一个事务点。。
SAVEPOINT  XXXX
回滚的时候
ROLLBACK [WORK] TO SAVEPOINT xxx


ALTER TRIGGER [trig_Test_Insert2]
ON [dbo].[test]
FOR INSERT 
AS 
BEGIN
SAVEPOINT  XXXX
SELECT 1/0
ROLLBACK [WORK] TO SAVEPOINT xxx
END


这样?
似乎都过不了哦……

#7



SAVEPOINT xxx 

begin try  
...
end try  
begin catch  
  select '执行失败'  
  ROLLBACK [WORK] TO SAVEPOINT xxx
end catch  

--其他代码

#8


引用 7 楼 fredrickhu 的回复:

SAVEPOINT xxx 
begin try  
...
end try  
begin catch  
  select '执行失败'  
  ROLLBACK [WORK] TO SAVEPOINT xxx
end catch  
--其他代码

通不过……
触发器如何才能忽略错误,不产生回滚

#9


引用 3 楼 DBA_Huangzj 的回复:
触发器是一个事务,出错了当然回滚,要不回滚的话就不要用触发器


如果不用触发器, 如何检测数据有了改动?
前提:不能在程序中控制……

#10


sql 版本多少?数据改动了是否“仅记录”?

#11


2008的话,可以用CDC,我已经做好了案例 http://blog.csdn.net/dba_huangzj/article/details/8130448

#12


引用 10 楼 DBA_Huangzj 的回复:
sql 版本多少?数据改动了是否“仅记录”?

2005

#13


触发器如何才能忽略错误,不产生回滚。不过可以换个思路,你为什么要回滚呢?把变动的数据用触发器插入别的表就可以了

#14


引用 13 楼 DBA_Huangzj 的回复:
触发器如何才能忽略错误,不产生回滚。不过可以换个思路,你为什么要回滚呢?把变动的数据用触发器插入别的表就可以了


其实我这个触发器最终要做的事情就是将数据远程插入到其它库的表中……

但即使是在此触发器中将这个数据插入同一库的另一个表中,难道就绝对不会有异常出现吗?


#15


允许在调试、测试过程中有异常,正式运行的话,不应该有很多异常

#16


BEGIN TRANSACTION
SAVE TRAN SP1
begin try  
SELECT 1/0
end try  
begin catch  
  --select '执行失败'  
  ROLLBACK TRAN SP1
end catch  
--SELECT * FROM SYS.objects
COMMIT

#17


引用 16 楼 fredrickhu 的回复:
BEGIN TRANSACTION
SAVE TRAN SP1
begin try  
SELECT 1/0
end try  
begin catch  
  --select '执行失败'  
  ROLLBACK TRAN SP1
end catch  
--SELECT * FROM SYS.objects
COMMIT


触发器如何才能忽略错误,不产生回滚

非常感谢您的热心……
不过我的测试代码很全了, F姐可以测试下再发的。

#18


该回复于2016-01-03 15:24:33被管理员删除