私のソフトウェアは一度に約 5000 レコードを Oracle データベースに挿入する必要があるため、以前はこれを行っOracleBulkCopy
ていました。私のテーブルは、トリガーを使用して主キーを自動インクリメントします。ただし、OracleBulkCopy
「ORA-26086: ダイレクト パスはトリガーをサポートしていません」という例外がスローされます。
OracleBulkCopy
では、主キーを使用して自動インクリメントするにはどうすればよいですか?
このタイプのシナリオに対する一般的な解決策は、ステージングテーブルへの一括読み込みを実行することです。データをすばやく投入できるトリガーなどのない別のテーブル。これは、帯域幅とラウンドトリップ パフォーマンスの点でバルク ロードの利点が得られることを意味します。それで; データがステージング テーブルにある場合にのみ、通常の SQL (おそらく) を使用して、データをステージング テーブルから実際のトランザクション テーブルに移動します。これはデータベース サーバーに対して完全にローカルであるため、非常に高速です。insert
これの優れた利点は、*バルク ロードを実行している間、実際のユーザーに影響を与えないことです。実際のユーザーは、まだ触れていないトランザクションテーブルのみを見ているためです。
Justin Cave のソリューションは簡単に達成できますが、1 つの問題があります。それが私の手順です:
ユーザーがステップ 2 (または 3、4) にいる場合 - 彼はトリガーを無効にしました。また、別のコンテキストの別のユーザーも、その時点で私のテーブルにレコードを挿入するため、増加した ID を取得できません。
Marc Gravell のソリューションは非常に優れているようです。しかし、私が達成するのは難しいです。私のプロジェクトは Entity Framework を使用しています。つまり、データベース内の各テーブルで、同じ構造を持つ別のテーブルを作成する必要がありますか?