別のユーザーの次のエラーをトラブルシューティングしています。他のユーザーは非常に単純な SSIS パッケージを持っています。彼のパッケージには、ソースと宛先が含まれています。
ソースは別のデータベースです。A と宛先が別のデータベースであるとしましょう。Bとしましょう
ユーザーは、テーブル SrcDBTabA から DstDBTabB にデータをコピーしたいと考えています。
彼の SSIS では、データ フロー タスクを使用しています。データ フロー タスクの分離レベルは Serializable に設定され、TransactionOption はサポートされています。
OLE DB ソースのデータ フロー タスクでは、SQL クエリを使用して SrcDBTabA からデータを取得します。彼のクエリは
SELECT SourceID, SourceName,SourceLastName FROM SrcDBTabA WHERE STATUS=1
次に、OLE DB Destination で、ソース入力列を自分のテーブルにマップし、オプションの [テーブル ロックと制約のチェック] をオンにします。彼の FastLoadKeepIndentity は False FastLoadKeepNulls は False FastLoadOptions は TabLock、Check_Constraints です
ほとんどの場合、パッケージは正常に実行されますが、主キーの違反というエラーで失敗することがあります。「一意のインデックスを持つオブジェクトに重複するキー行を挿入できません」
ここで、ソース データベース テーブル SrcDBTabA で興味深いことが起こっています。
このテーブルは、15 分ごとに別のデータベースからデータを取得し、データはソース データベースに継続的に書き込まれます。このデータベースでは多くの NOLOCKS クエリを使用しており、別の DB からソース データベース テーブル SrcDBTabA に書き込みを行う際に、NOLOCKS を使用しています。
ソース データベース テーブル SrcDBTabA には重複するキーはありません。ID 列はプライマリに設定され、クラスター化されています。
IS Read Committed SnapShot ON の Source DB プロパティが FALSE に設定されています。
このエラーが発生する可能性があると考えられることの 1 つは、dirtypages が原因です。
以下の理由をウェブで読みました。リンクはSame Data Read Twiceです
しかし、SelectクエリでNO Lockを使用しておらず、その分離レベルがSerializedに設定されている場合、SSISで重複した主キー値を読み取ることができる方法を理解できません
これについてはお答えできませんし、QA でこの問題を再現することもできません。
任意の考えや推論