2012-04-27 11 views
0

私のウェブサイトでは、2つのパスワード(実際にはウェブサイトの人間のユーザーが知っている限り同じパスワードを使用していますが、2つの異なるアルゴリズムと塩を使用してハッシュし塩漬けしています) 1つはWebUsersテーブルの場所で、ユーザーがWebサイトにログインするときにパスワードが確認されます。もう1つはOracleユーザーのパスワードで、各WebサイトユーザーはOracleユーザーに対応しています。DDLステートメントの実行前の自動コミットの回避策

パスワード変更手順を実行する場合、WebUsers表およびOracleでのパスワードをトランザクション内で変更する必要があります。問題は、アクションを実行する前にDDL文[alter user ...]がコミットされることです。 [alter user ...]が失敗し、例外処理コードでトランザクションをロールバックすると、WebUsersテーブルの変更はロールバックされません。何か回避策はありますか?

+0

古いハッシュ値を変数に格納し、DDLに失敗した場合にWebUsersテーブルを古い値で再度更新することはできませんか? –

+1

パスワードをOracleおよびテーブルに保存するのはなぜですか?あなたの認証を組み合わせることができない理由があるので、問題を完全に排除しますか? –

答えて

0

Oracleでは、1つのアトミック・トランザクションでDMLとDDLを使用する方法はありません。

Oracleでは、DDLはDDLを実行する前に必ず明示的にコミットします。

通常、この種のシナリオでは、最初に失敗する可能性の高い手順、つまり自分のDDLの「ユーザー変更」を実行する必要があります。

DDLが成功した場合にのみDMLを実行しますが、もう一度DMLに問題があり、DDLをロールバックできない場合は、別のDDLを実行する必要がありますDDLを使用して、最初のDDLによって加えられた変更を元に戻します。

考え方は、2番目のステップが最初のステップよりも失敗する可能性が高いという考えです。

このパターンは、JMS + JDBCのようなものに対処する必要がある場合にも使用され、JTAトランザクションを使用してJMS + JDBCアクティビティを単一の変換でラップすることはできません。