-----测试一 触发器中的在什么时候不放rollback
//表定义
CREATE TABLE [test] (
[test] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED
(
[test]
) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TRIGGER tr_ins ON [dbo].[test]
FOR INSERT
AS
rollback transaction
go
pb语句
string ls_code,ls_err
insert into test values('aa');
ls_code=string(sqlca.sqlcode)
ls_err=sqlca.sqlerrtext
if sqlca.sqlcode=0 then
commit;
else
rollback;
end if
messagebox(ls_code,ls_err) //为0
messagebox(string(sqlca.sqlcode),sqlca.sqlerrtext) 为-1 commit没有begin transaction
说明:1.触发器中的rollbak tran 撤消语句的修改 直接将@@trancount=0,再执行commit就会出错
2.语句执行虽然被撤消,但没有出错,所以是成功执行.返回状态为0
触发器改后:
CREATE TRIGGER tr_ins ON [dbo].[test]
FOR INSERT
AS
raiserror('err ',16,1)
rollback transaction
结果为 -1
-1 rollback without begin transaction
最后正确的改法为:如果是显示的提交和撤消语句(应用程序中用如pb)
触发器中应去掉 rollback语句,就由应用程序来撤消
结果为 -1
0
语句被正常处理,insert语句被撤消
--但是如果使用自动提交的将rollback去掉只保留raiserror,是不会回滚(使用自动提效时就将rollback加上)
CREATE PROCEDURE dt_test AS
insert into test select '1'
insert into test values('2')
GO
insert into test values('1')
go
exec dt_test
//存储过程中第一条语句 insert into test select '1' 主键重复出错,但并没有终止,继续执行下一条语句
这就造成事务的错误,(要么全部修改,要么全部不修改)
所以要在每条语句后面测试执行的结果 用@@error来测试
CREATE PROCEDURE dt_test AS
begin tran t
insert into test select '1'
if @@error<>0
goto fin
insert into test values('2')
if @@error<>0
goto fin
commit tran t
return
fin:
raiserror ('error',16,1)
rollback tran t
GO