如何使用 RDBMS DML 创建任意错误

How to create arbitrary error with RDBMS DML

背景

问题

现在我正在测试一些 SQLException 的错误处理例程。例如,我想将 ORA-00001(违反唯一约束)或 ORA-00054(无法获取独占锁)视为可恢复错误。另一方面,我想将 ORA-00060(死锁)视为不可恢复的错误。

现在我正在尝试为这个错误处理例程编写 JUnit 测试用例。为了使测试用例尽可能可移植,我正在寻找一种方法来使用像 SELECT RAISE_ERROR(-54) FROM DUAL 这样的简单 DML 来生成任意错误(ORA-00001、ORA-00054、...)。另外,我想避免在测试用例中模拟 SQLException 本身,因为 SQLException 的内容可以在 RDBMS 的版本之间更改。

问题

有什么方法可以在 RDBMS(尤其是 Oracle 和 PostgreSQL)中使用 DML 创建任意 SQL 错误?或者,是否有像 DBUnit 这样的测试框架具有创建任意 SQLException 的功能?如果没有特定的表和记录就可以发生错误是可取的。

在 SQL 中没有人为导致给定错误的可移植方法,您必须为每个数据库编写代码。

但我想给你一些一般性的建议:

  • 使用标准化的 SQLSTATE 而不是系统特定的错误代码,如 Oracle 的 ORA-xxxxx 编号。那应该是便携的。

    所有 RDBMS 都应该有一种方法来检索错误消息的 SQLSTATE。

  • 我不知道你所说的“可恢复错误”是什么意思,但死锁显然不是持久性错误——如果你重复事务,它可能会成功。

    另一方面,违反约束是一种持续性错误。只要你想重试,你总是会得到同样的错误。 “恢复”的唯一方法是 运行 不同的语句或修改数据库以避免冲突。