4

私のソフトウェアは一度に約 5000 レコードを Oracle データベースに挿入する必要があるため、以前はこれを行っOracleBulkCopyていました。私のテーブルは、トリガーを使用して主キーを自動インクリメントします。ただし、OracleBulkCopy「ORA-26086: ダイレクト パスはトリガーをサポートしていません」という例外がスローされます。

OracleBulkCopyでは、主キーを使用して自動インクリメントするにはどうすればよいですか?

4

3 に答える 3

4

このタイプのシナリオに対する一般的な解決策は、ステージングテーブルへの一括読み込みを実行することです。データをすばやく投入できるトリガーなどのないテーブル。これは、帯域幅とラウンドトリップ パフォーマンスの点でバルク ロードの利点が得られることを意味します。それで; データがステージング テーブルにある場合にのみ、通常の SQL (おそらく) を使用して、データをステージング テーブルから実際のトランザクション テーブルに移動します。これはデータベース サーバーに対して完全にローカルであるため、非常に高速です。insert

これの優れた利点は、*バルク ロードを実行している間、実際のユーザーに影響を与えないことです。実際のユーザーは、まだ触れていないトランザクションテーブルのみを見ているためです。

于 2013-06-14T09:55:03.607 に答える
0

Justin Cave のソリューションは簡単に達成できますが、1 つの問題があります。それが私の手順です:

  1. トリガーを無効にする
  2. シーケンスから 5000 個の ID を取得する
  3. ID をレコードに割り当てる
  4. データベースへの一括挿入の実行
  5. トリガーを有効にする

ユーザーがステップ 2 (または 3、4) にいる場合 - 彼はトリガーを無効にしました。また、別のコンテキストの別のユーザーも、その時点で私のテーブルにレコードを挿入するため、増加した ID を取得できません。

Marc Gravell のソリューションは非常に優れているようです。しかし、私が達成するのは難しいです。私のプロジェクトは Entity Framework を使用しています。つまり、データベース内の各テーブルで、同じ構造を持つ別のテーブルを作成する必要がありますか?

于 2013-06-17T09:46:56.207 に答える