gpt4 book ai didi

sql - DB2 SQL 脚本 : how to start a transaction and rollback on error

转载 作者:行者123 更新时间:2023-12-04 23:44:00 24 4
gpt4 key购买 nike

我正在为 DB2 数据库 (V9.5) 实现一个 SQL 脚本,以便添加列和重新组织数据。我想从 linux 命令行执行脚本:

$ db2 -vstf migration.sql

migration.sql 中的所有语句都应该包含在事务中。如果一条语句失败,则必须回滚所有先前的更改。我怎样才能做到这一点?我尝试使用 START TRANSACTION,但 DB2 在这种情况下返回语法错误。

迁移.sql

    connect to ...        

-- not accepted by DB2
START TRANSACTION;

update ... set ...
alter table ...

COMMIT;

connect reset;
terminate;

此外,我尝试按照描述关闭自动提交 here :

  • db2 +c -vstf migration.sql(在脚本中打开连接时不起作用)
  • update command options using c off 添加到 migration.sql(出错时不回滚任何内容)

那么,是否有人有想法让事务和回滚按预期在 db2 命令行上运行?如果不是,它是否适用于 Java/JDBC?

最佳答案

从脚本中删除连接和提交并在 shell 中执行。然后使用 +c 并测试退出状态(假设是 bash,应该很容易移植到其他 shell):

db2 connect to <db>

db2 +c -vstf migration.sql
if [ $? -ge 4 ]; then
db2 rollback
else
db2 commit
fi

db2 返回:

* 8 on system error
* 4 db2 error (constraint violation, object not found etc)
* 2 db2 warning
* 1 no rows found

-s 将停止执行退出代码 >= 4,测试检查这是否发生并回滚事务。此外,您可能还想添加一个日志文件:

db2 -l migration.log +c -vstf migration.sql
if [ $? -ge 4 ]; then
db2 rollback
tail -10 migration.log
else
db2 commit
fi

如果出现错误,您可以跟踪日志文件以快速找出错误所在。如果您使用日志文件,您可能希望删除 -v,因为它有点嘈杂:

db2 -l migration.log +c -stf migration.sql
if [ $? -ge 4 ]; then
db2 rollback
tail -10 migration.log
else
db2 commit
fi

关于sql - DB2 SQL 脚本 : how to start a transaction and rollback on error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494089/

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