0

Oracleの組み込み認証メカニズムを使用してユーザーアカウントとパスワードを管理するアプリケーションに取り組んでいます。アプリケーションは行レベルのセキュリティも使用します。基本的に、アプリケーションを介して登録するすべてのユーザーは、「USERS」テーブルの通常のエントリではなく、Oracleのユーザー名とパスワードを取得します。ユーザーは、特定のテーブルのラベルも受け取ります。このタイプの機能では、多くの場合、DMLステートメントとDDLステートメントの実行を組み合わせる必要がありますが、DDLステートメントは暗黙的なコミットを実行するため、これは問題を引き起こします。DDLステートメントの実行後にエラーが発生した場合、トランザクション管理はすべてをロールバックしません。たとえば、新しいユーザーがシステムに登録すると、次のことが発生する可能性があります。

  1. トランザクションを開始します
  2. 人物の詳細をテーブルに挿入します。(つまり、名、姓など)-DML
  3. Oracleアカウントを作成します(パスワードで識別されるユーザーtestuserを作成します;)-DDL暗黙的コミット。トランザクションは終了します。
  4. 新しいトランザクションが開始されます。
  5. より多くのDMLステートメント(挿入、更新など)を実行します。
  6. エラーが発生し、トランザクションはステップ4にのみロールバックします。

上記のロジックが設計どおりに機能していることは理解していますが、このタイプの機能を単体テストしてデータアクセス層で管理するのは難しいと感じています。データベースがダウンしたか、単体テスト中にエラーが発生したため、ロールバックする必要のあるテストデータでテストスキーマが汚染されました。これが発生したときにテストスキーマをワイプするのは簡単ですが、実稼働環境でのデータベースの障害が心配です。これを管理するための戦略を探しています。

これはJava/Springアプリケーションです。Springはトランザクション管理を提供しています。

4

3 に答える 3

3

最初に私は言わなければなりません:このようにそれをするのは悪い考えです。2つの理由:

  1. 接続はユーザーに基づいています。つまり、接続プールのメリットを大幅に失うことになります。また、それはひどくうまくスケーリングしません。一度に10,000人のユーザーがいる場合は、(ソフト接続プールではなく)ハード接続を継続的に開いたり閉じたりします。と
  2. ご存知のとおり、ユーザーの作成と削除はDMLではなくDDLであるため、「トランザクション性」が失われます。

なぜこれを選択したのかはわかりませんが、データベース層ではなく、アプリケーションでユーザーを実装することを強くお勧めします。

あなたの問題を解決する方法に関しては、基本的にあなたはできません。シーケンスの途中でテーブルまたはインデックスを作成する場合と同じです。

于 2009-05-21T13:33:52.760 に答える
1

行レベル セキュリティと組み合わせて Oracle プロキシ認証を使用する必要があります。

これを読んでください: http://www.oracle.com/technology/pub/articles/dikmans-toplink-security.html

于 2009-05-21T14:46:03.427 に答える
0

以前のコメントのいくつかには同意しませんが、組み込みの Oracle アカウント セキュリティを使用することには多くの利点があると言えます。追加情報を含むユーザーの何らかのシャドー テーブルでこれを拡張する必要がある場合は、PRAGMA AUTONOMOUS_TRANSACTION と宣言された別のパッケージに Oracle アカウントの作成をラップし、挿入を行っているパッケージに成功/失敗ステータスを返す方法はどうですか?シャドーテーブル?これにより、Oracle アカウントの作成がトランザクションから切り離されると思います。

于 2009-05-21T14:41:42.530 に答える