Erreur d’assertion SQL Server lorsque vous essayez d’exécuter une instruction Insert en bloc ou BCP

Cet article vous aide à résoudre le problème qui se produit lorsque vous essayez d’exécuter une ou une BULK INSERTBCP opération.

Version du produit d’origine : SQL Server 2008 R2 Enterprise, SQL Server 2008 Enterprise
Numéro de la base de connaissances d’origine : 2700641

Symptômes

Considérez le scénario suivant :

  • Le serveur A et le serveur B exécutent Microsoft SQL Server 2008 ou SQL Server 2008 R2.

  • Vous configurez la mise en miroir de bases de données entre le serveur A et le serveur B.

  • Vous exécutez une instruction ou BULK INSERT une BCP instruction sur la base de données principale.

    Remarque

    Par défaut, l’option CHECK_CONSTRAINTS est désactivée lorsque vous exécutez une instruction ou BULK INSERT une BCP instruction.

  • La mise en miroir de bases de données est interrompue et la session de mise en miroir de bases de données entre dans l’état SUSPENDED.

Dans ce scénario, une assertion se produit sur le serveur miroir. Par conséquent, un fichier mini-vidage est créé dans le dossier du journal SQL Server. En outre, vous voyez l’erreur suivante dans le journal des erreurs SQL Server sur le serveur miroir :

Remarque

Vous devez réinitialiser la mise en miroir de bases de données pour résoudre ce problème.

La cause

Ce problème se produit parce que les informations de compatibilité de verrou dans le journal des transactions de la base de données principale ne sont pas transférées vers le serveur miroir.

Contournement

Pour contourner ce problème, exécutez l’instruction ou l’instruction BULK INSERT sur la base de données principale à l’aide de l’optionBCP.CHECK_CONSTRAINTS

Remarque

L’option CHECK_CONSTRAINTS entraîne des performances plus lentes. Toutefois, l’assertion de verrou sur le serveur miroir ne se produit pas.

Plus d’informations

Pendant une BULK INSERT ou BCP une opération, une transaction enfant désactive l’option CHECK_CONSTRAINTS . Cette transaction enfant utilise un verrou compatible avec les verrous de transaction parent. Les informations de compatibilité sont stockées dans le journal des transactions de la base de données principale. Par conséquent, la demande de verrou de transaction enfant est accordée sur la base de données principale.

Toutefois, ces informations de compatibilité ne sont pas transférées vers le serveur miroir. Par conséquent, la demande de verrou de transaction enfant n’est pas compatible avec les verrous de transaction parent sur le serveur miroir. Ce scénario provoque l’assertion sur le serveur miroir.