一括挿入または BCP ステートメントを実行しようとするとアサーション エラーが発生するSQL Server

この記事は、または BCP 操作を実行しようとしたときに発生する問題をBULK INSERT解決するのに役立ちます。

元の製品バージョン: SQL Server 2008 R2 Enterprise、SQL Server 2008 Enterprise
元の KB 番号: 2700641

現象

次のような状況で問題が発生します。

  • サーバー A とサーバー B は、Microsoft SQL Server 2008 または SQL Server 2008 R2 を実行しています。

  • サーバー A とサーバー B の間でデータベース ミラーリングを設定します。

  • プリンシパル データベースで BULK INSERT または BCP ステートメントを実行します。

    注:

    既定では、 または BCP ステートメントをCHECK_CONSTRAINTS実行BULK INSERTすると、 オプションは off に設定されます。

  • データベース ミラーリングが切断され、データベース ミラーリング セッションが SUSPENDED 状態になります。

このシナリオでは、アサーションがミラー サーバーで発生します。 そのため、ミニダンプ ファイルは、SQL Server ログ フォルダーに作成されます。 さらに、ミラー サーバーのSQL Server エラー ログに次のエラーが表示されます。

注:

この問題を解決するには、データベース ミラーリングを再初期化する必要があります。

原因

この問題は、プリンシパル データベースのトランザクション ログのロック互換性情報がミラー サーバーに転送されないために発生します。

回避策

この問題を回避するには、 オプションを BULK INSERT 使用してプリンシパル データベースで or BCP ステートメントを CHECK_CONSTRAINTS 実行します。

注:

このオプションを CHECK_CONSTRAINTS 使用すると、パフォーマンスが低下します。 ただし、ミラー サーバーのロック アサートは発生しません。

詳細

BULK INSERTまたは BCP 操作中に、子トランザクションはオプションをCHECK_CONSTRAINTSオフにします。 この子トランザクションでは、親トランザクション ロックと互換性のあるロックが使用されます。 互換性情報は、プリンシパル データベースのトランザクション ログに格納されます。 そのため、子トランザクション ロック要求はプリンシパル データベースに対して付与されます。

ただし、この互換性情報はミラー サーバーに転送されません。 したがって、子トランザクション ロック要求は、ミラー サーバー上の親トランザクション ロックと互換性がありません。 このシナリオでは、ミラー サーバーでアサートが発生します。