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

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






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL存储过程触发器是MySQL提供的两种基本的数据库对象。它们都可以用来处理数据库的数据和执行某些操作,但是它们的实现目的和使用场景有所不同。 1. 存储过程 MySQL存储过程是一种预编译的程序,可以在MySQL服务器上进行存储和执行。存储过程通常用于封装一组SQL语句,以便在需要时可以重复使用它们。存储过程可以包含变量、条件语句、循环语句和异常处理等元素,使其更加灵活和强大。 存储过程的主要优点是: - 可以提高数据库的性能,因为存储过程只需要在第一次执行时进行编译,以后执行时直接使用编译好的代码。 - 可以重复使用,减少代码的重复编写和维护工作。 - 可以实现比一般SQL语句更为复杂的数据处理操作。 2. 触发器 MySQL触发器是一种特殊的存储过程,它是在特定的数据操作(如插入、更新、删除)发生时自动执行的。触发器通常用于实现数据约束和业务逻辑,以确保数据的完整性和一致性。 触发器的主要优点是: - 可以自动执行,减少了手动操作的错误和疏漏。 - 可以实现更加严格的数据约束和业务逻辑,从而提高数据的安全性和可靠性。 综上所述,存储过程触发器都是MySQL提供的强大功能,它们可以帮助我们更好地管理和处理数据库的数据。在实际应用,我们需要根据具体的业务需求和数据操作情况,选择合适的方式来使用存储过程触发器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值