2009-05-21 50 views
0

我正在研究使用Oracle的内置身份验证机制来管理用户帐户和密码的应用程序。该应用程序还使用行级安全性。基本上,通过应用程序注册的每个用户都会获得Oracle用户名和密码,而不是“USERS”表中的典型条目。用户还会在特定的表格上收到标签。这种类型的功能要求在许多情况下将DML和DDL语句的执行结合起来,但这会造成问题,因为DDL语句执行隐式提交。如果在执行DDL语句后发生错误,事务管理将不会将所有内容都回滚。例如,当一个新的用户与系统注册以下可能发生:单元测试需要在事务中的DDL语句

  1. 开始交易
  2. 插入人的细节到一个表。 (即名字,姓氏等)-DML
  3. 创建一个oracle账户(创建用户testuser用密码标识;)-DDL隐式提交。交易结束。
  4. 新交易开始。
  5. 执行更多的DML陈述(插入,更新等)。发生
  6. 错误,交易仅回滚到步骤4。

我明白,上述的逻辑是事先设计好的,但我难以寻找到单元测试这种类型的功能和数据管理它接入层。我在数据库关闭或单元测试期间发生错误,导致测试模式被本应回退的测试数据所污染。在发生这种情况时很容易擦除测试模式,但我担心生产环境中的数据库故障。我正在寻找解决这个问题的策略。

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

+0

为用户创建一个帐户需要添加新表..? – 2009-05-21 13:36:22

+0

我强烈建议您阅读cletus的答案,然后再决定使用USERS表的更传统的方法... – 2009-05-21 13:42:40

回答

2

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

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

不知道为什么你选择做这个,但我会强烈建议您实现在应用程序的用户,而不是数据库层。

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

0

我不同意一些以前的评论,并说使用内置的Oracle帐户安全性有很多好处。如果您必须用某种附加信息的用户影子表来扩充这种情况,那么如何将Oracle帐户创建包装在声明为PRAGMA AUTONOMOUS_TRANSACTION的单独包中,并向插入的包返回成功/失败状态影子桌?我相信这会将Oracle帐户创建与交易隔离开来。