Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 执行前自动提交DDL语句的变通方法_Oracle - Fatal编程技术网

Oracle 执行前自动提交DDL语句的变通方法

Oracle 执行前自动提交DDL语句的变通方法,oracle,Oracle,我为我的网站保留了两个密码(就网站用户所知,实际上是相同的密码,但使用两种不同的算法和盐进行了哈希和盐析)。一个是WebUsers表中的位置,即用户登录网站时验证密码的位置。另一个是oracle用户的密码,每个网站用户对应一个oracle用户 在执行更改密码过程时,我必须在事务中更改WebUsers表以及oracle中的密码。问题是,DDL语句[alter user…]必须在执行任何操作之前提交。如果[alter user…]失败,并且在异常处理代码中我回滚了事务,则不会回滚WebUsers表中

我为我的网站保留了两个密码(就网站用户所知,实际上是相同的密码,但使用两种不同的算法和盐进行了哈希和盐析)。一个是WebUsers表中的位置,即用户登录网站时验证密码的位置。另一个是oracle用户的密码,每个网站用户对应一个oracle用户


在执行更改密码过程时,我必须在事务中更改WebUsers表以及oracle中的密码。问题是,DDL语句[alter user…]必须在执行任何操作之前提交。如果[alter user…]失败,并且在异常处理代码中我回滚了事务,则不会回滚WebUsers表中的更改。有什么解决办法吗?

在Oracle下,在一个原子事务中不可能有DML和DDL

在Oracle中,DDL总是在运行DDL之前显式地导致提交

通常在这类场景中,您应该首先执行最有可能失败的步骤,即在您的情况下,DDL“Alter User”

然后运行您的DML,只有在DDL成功的情况下才运行,但同样存在DML失败的问题,然后无法回滚DDL,此时您只需运行另一个DDL即可恢复第一个DDL所做的更改

我们的想法是,第二步比第一步更容易失败


这种模式也被使用,比如说,你必须处理JMS+JDBC,而且,您不能使用JTA事务将JMS+JDBC活动包装在一个事务中。

如果DDL失败,您不能将旧的哈希值存储在变量中,然后用旧的值再次更新WebUsers表吗?为什么您要将密码保存在Oracle和表中?您的身份验证不能合并,从而完全消除问题,这有什么原因吗?