unit testing需要在事务中的DDL语句

我正在开发一个使用Oracle内置身份validation机制来管理用户帐户和密码的应用程序。 该应用程序还使用行级安全性。 基本上,通过应用程序注册的每个用户都获得Oracle用户名和密码,而不是“USERS”表中的典型条目。 用户还会在某些表格上收到标签。 这种类型的function要求在许多实例中组合执行DML和DDL语句,但这会产生问题,因为DDL语句执行隐式提交。 如果在执行DDL语句后发生错误,则事务管理不会回滚所有内容。 例如,当新用户向系统注册时,可能会发生以下情况:

  1. 开始交易
  2. 将人员详细信息插入表格中。 (即名字,姓氏等)-DML
  3. 创建一个oracle帐户(创建用密码标识的用户testuser;)-DDL隐式提交。 交易结束。
  4. 新交易开始。
  5. 执行更多DML语句(插入,更新等)。
  6. 发生错误,事务仅回滚到步骤4。

据我所知,上述逻辑按设计工作,但我发现很难对这类function进行unit testing并在数据访问层进行管理。 我的数据库出现故障或unit testing期间发生错误导致测试模式被应回滚的测试数据污染。 当发生这种情况时,很容易擦除测试模式,但我担心生产环境中的数据库故障。 我正在寻找管理这个的策略。

这是一个Java / Spring应用程序。 Spring提供了事务管理。

您应该将Oracle代理身份validation与行级别安全性结合使用。

请阅读: http : //www.oracle.com/technology/pub/articles/dikmans-toplink-security.html

首先,我不得不说:这样做的坏主意。 有两个原因:

  1. 连接基于用户。 这意味着您在很大程度上失去了连接池的好处。 它也不能很好地扩展。 如果您同时拥有10,000个用户,那么您将不断打开和关闭硬连接(而不是软连接池); 和
  2. 正如您所发现的,创建和删除用户是DDL而不是DML,因此您将失去“事务性”。

不确定为什么你选择这样做但我强烈建议你在应用程序而不是数据库层实现用户。

至于如何解决你的问题,基本上你不能。 就像在序列中间创建表或索引一样。

我不同意之前的一些评论,并说使用内置的Oracle帐户安全性有很多好处。 如果你必须使用某种具有附加信息的用户影子表来扩充它,那么如何将Oracle帐户创建包装在一个单独的包中,该包被声明为PRAGMA AUTONOMOUS_TRANSACTION并将一个成功/失败状态返回到正在执行插入的包中影子表? 我相信这会将Oracle帐户创建与事务隔离开来。