2009-05-21 19 views
0

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

  1. スタートトランザクション
  2. 挿入人物の詳細:新しいユーザーがシステムに登録する際にたとえば、場所を取るかもしれません、次の。 (姓、名字など)-DML
  3. oracleアカウントを作成します(パスワードで識別されるユーザーtestuserを作成します)。 - DDL暗黙的なコミット。トランザクションは終了します。
  4. 新しい取引が開始されます。
  5. より多くのDML文(挿入、更新など)を実行します。
  6. エラーは、トランザクションが唯一の私は上記のロジックが設計どおりに動作していることを理解する4.

段階にロールバックし、発生したが、私はユニットテストにこの種の機能を困難にそれを発見したデータで、それを管理していますアクセス層。私は、データベースがダウンしたり、ユニットテスト中にエラーが発生して、テストスキーマがロールバックされるべきテストデータで汚染されてしまいました。これが起こったときにテストスキーマを消去するのは簡単ですが、実稼働環境でのデータベースの障害が心配です。私はこれを管理する戦略を探しています。

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

+0

新しいアカウントを追加する必要があります.. ..? –

+0

私は、cletusの答えを読んで、代わりにUSERSテーブルでより伝統的なアプローチを使うことを強くお勧めします。 –

+0

@matt b。 いいえ、Oracleアカウントを作成する場合、Oracleの行レベルのセキュリティ機能を使用している場合は、既存の表にラベルを追加する必要があります。 –

答えて

2

まず、私は言う必要があります:このようにして悪い考え。 2つの理由から:

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

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

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

+0

私はこれを複数回upvoteできますか? –

+0

アーキテクチャを選択することはできませんでしたが、行レベルのセキュリティをサポートするために選択されたと思います。また、興味深いことに、あなたは接続を持ち出しました。私たちは、5人のユーザーが大量(約150件)の接続を使い切っていることに気付きました。アプリケーションは、リクエストごとに、ユーザーの資格情報をSpringのUserCredentialsDataSourceAdapterに注入します。 –

0

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