DAC_Clusteredインデックスの一意識別子のオーバーフローが原因でINSERT SQLコマンドが失敗することがある


解説

以前に、SitecoreはDAC_Indexテーブル列に基づいて、クラスター化インデックスを持たないデータベース テーブルをDAC_Clusteredインデックスで拡張しました。

これは、Azure SQLへのさらなるデプロイのためのDACPAC/BACPACファイルを作成できるようにするためのものです。

このインデックスは一意ではないため、データベース エンジンは内部的な理由により、4バイトの一意識別子カラムをテーブルに自動的に追加します。

DAC_Index列にはすべてのテーブル行で同じNULL値が含まれているため、インデックス一意識別子の値は後続の行ごとに増分されていきます。

インデックス一意識別子の値が最大intサイズ(2147483647)を超えると、新しいエントリをテーブルに挿入するときに次のようなエラーが発生します:

System.Data.SqlClient.SqlException: The maximum system-generated unique value for a duplicate group was exceeded for index with partition ID 72057623183360000. Dropping and re-creating the index may resolve this; otherwise, use another clustering key.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

クラスタ化インデックスの詳細については、こちらをご覧ください:クラスタ化インデックスの設計ガイドライン

解決策

オンプレミス ソリューションの場合、影響を受けるテーブルからDAC_Clusteredインデックスを削除します。

オフプレミス(クラウド)ソリューションでエラーが発生した場合は、Sitecore サポートに問い合わせてください。