gpt4 book ai didi

error-handling - 如何在 Sybase ASE 中处理事务?

转载 作者:行者123 更新时间:2023-12-03 08:13:39 24 4
gpt4 key购买 nike

我必须在测试环境中将记录插入表中,以便我现在知道它会引发主键约束违规。而且由于脚本一旦从一个环境迁移到另一个环境时将由其他人独立运行,我希望在遇到问题时让我的脚本回滚。

我的脚本如下:

use my_db
go

--
-- No rows of the given "my_code" must exist, as they shall be replaced.
--
if exists (
select 1
from my_table
where my_code like 'my_code'
) delete from my_table
where my_code like 'my_code'

--
-- All rows shall be inserted altogether, or rejected altogether at once.
--
begin tran a
insert into my_table (field1, field2, field3) values (value1, value2, value3)

if @@error != 0 or @@transtate != 0
begin
rollback tran a
end

insert into my_table (field1, field2, field3) values (value1, value2, value3)

if @@error != 0 or @@transtate != 0
begin
rollback tran a
end

commit tran a
go

我已经尝试了我可以从这些帖子中得到什么:
  • Error Handling in Sybase
  • How to continue executing rest of while loop even if an exception occurs in sybase?
  • Transaction Handling in Sybase

  • 我试过只验证 @@error , @@transtate和两者,我总是得到消息框报告错误,并且没有记录回滚,即仍然插入经过的行。

    我想知道是否有一种方法可以确保 Sybase 按预期充分处理事务,或者,只需确保在插入行时它不会自动提交行,因为 SQL Server 允许它 - 我的意思是,SQL Server 继承自 Sybase,毕竟……我不知道它是进入 Sybase 还是对 SQL Server 来说是新的。

    我希望避免出现错误,最好记录错误并回滚或删除事务中插入的行。

    请注意,我不使用存储过程。此脚本是一次性更新数据库,以针对使用数据库的软件中最近发生的更改进行更新。

    最佳答案

    代码看起来大部分是正确的。如果您在插入时遇到重复键错误,则 IF 测试将捕获该错误。

    但是,您还应该添加一些逻辑(GOTO 或基于标志的附加 IF-ELSE 测试),当您决定回滚第一个插入时,它会跳过第二个插入。

    目前,您的代码将始终执行第二次插入,无论如何。与其他一些数据库不同,在 ASE 控制流不受错误条件的影响,您需要自己拦截 .

    还要注意两个插入是相同的,所以如果表上有唯一索引,如果第一次插入成功,第二次插入总是会产生 dup-key 错误。

    听起来好像您正在使用在每个语句或其他内容之后检查状态的客户端? ASE 本身不会弹出任何错误消息框。

    要开发它,最好从命令行运行脚本

    isql [...] -i yourscriptfile.sql

    只说两句:
  • 您正在使用事务名​​称 ('a')。这不是必需的,实际上可能会导致问题:当您回滚到命名事务时,正如您所做的那样,它必须是最外层的事务,否则回滚将失败。最好不要使用事务名​​称。
  • 如果在执行此代码时已经有一个事务处于事件状态,则实际上可能会出现上一个项目符号中的这个问题。您应该始终在脚本开始时使用

    如果@@trancount > 0
    开始
    print '错误:事务已经激活'
    返回
    结束

  • 或类似的东西。

    高温下,

    罗布·V。

    关于error-handling - 如何在 Sybase ASE 中处理事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25086551/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com