--建测试表
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
SAVEPOINT XXXX
回滚的时候
ROLLBACK [WORK] TO SAVEPOINT xxx
#6
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
通不过……
#9
如果不用触发器, 如何检测数据有了改动?
前提:不能在程序中控制……
#10
sql 版本多少?数据改动了是否“仅记录”?
#12
2005
#13
。不过可以换个思路,你为什么要回滚呢?把变动的数据用触发器插入别的表就可以了
#14
其实我这个触发器最终要做的事情就是将数据远程插入到其它库的表中……
但即使是在此触发器中将这个数据插入同一库的另一个表中,难道就绝对不会有异常出现吗?
#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
非常感谢您的热心……
不过我的测试代码很全了, F姐可以测试下再发的。
#18
#1
调存储过程也不行
#2
要求:如果触发器出错, insert 依然成功!
#3
触发器是一个事务,出错了当然回滚,要不回滚的话就不要用触发器
#4
try/catch 后用final试试
#5
先保存一个事务点。。
SAVEPOINT XXXX
回滚的时候
ROLLBACK [WORK] TO SAVEPOINT xxx
SAVEPOINT XXXX
回滚的时候
ROLLBACK [WORK] TO SAVEPOINT xxx
#6
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
通不过……
#9
如果不用触发器, 如何检测数据有了改动?
前提:不能在程序中控制……
#10
sql 版本多少?数据改动了是否“仅记录”?
#11
2008的话,可以用CDC,我已经做好了案例
http://blog.csdn.net/dba_huangzj/article/details/8130448
#12
2005
#13
。不过可以换个思路,你为什么要回滚呢?把变动的数据用触发器插入别的表就可以了
#14
其实我这个触发器最终要做的事情就是将数据远程插入到其它库的表中……
但即使是在此触发器中将这个数据插入同一库的另一个表中,难道就绝对不会有异常出现吗?
#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
非常感谢您的热心……
不过我的测试代码很全了, F姐可以测试下再发的。