触发器和储存过程中错误处理

-----测试一  触发器中的在什么时候不放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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值