我正在开发一个使用Oracle内置身份验证机制来管理用户帐户和密码的应用程序。该应用程序还使用行级安全性。基本上,通过应用程序注册的每个用户都获得Oracle用户名和密码,而不是“USERS”表中的典型条目。用户还会在某些表格上收到标签。这种类型的功能要求在许多实例中组合DML和DDL语句的执行,但这会产生问题,因为DDL语句执行隐式提交。如果在执行DDL语句后发生错误,则事务管理不会回滚所有内容。例如,当新用户向系统注册时,可能会发生以下情况:
据我所知,上述逻辑按设计工作,但我发现很难对这类功能进行单元测试并在数据访问层进行管理。我已经让数据库关闭或在单元测试期间发生错误,导致测试模式被应该回滚的测试数据污染。发生这种情况时,很容易擦除测试模式,但我担心生产环境中的数据库故障。我正在寻找管理这个的策略。
这是一个Java / Spring应用程序。 Spring正在提供事务管理。
答案 0 :(得分:2)
首先我不得不说:这样做不好主意。有两个原因:
不确定为什么你选择这样做,但我强烈建议你在应用程序而不是数据库层实现用户。
至于如何解决你的问题,基本上你不能。就像在序列中间创建表或索引一样。
答案 1 :(得分:1)
您应该将Oracle代理身份验证与行级别安全性结合使用。
阅读本文:http://www.oracle.com/technology/pub/articles/dikmans-toplink-security.html
答案 2 :(得分:0)
我不同意之前的一些评论,并说使用内置的Oracle帐户安全性有很多好处。如果你必须使用某种具有附加信息的用户影子表来扩充它,那么如何将Oracle帐户创建包装在一个单独的包中,该包被声明为PRAGMA AUTONOMOUS_TRANSACTION并将一个成功/失败状态返回到正在执行插入的包中影子表?我相信这会将Oracle帐户创建与交易隔离开来。