CORRECTIF : Message d’erreur dans SQL Server 2008 lorsque vous exécutez une instruction INSERT SELECT sur une table : « Violation de contrainte de clé primaire '< PrimaryKey >'. Impossible d’insérer une clé en double dans l’objet '< nom_table >' »

Microsoft distribue les correctifs de Microsoft SQL Server 2008 en tant que fichier téléchargeable. Les correctifs étant cumulatifs, chaque nouvelle version contient tous les correctifs et correctifs de sécurité inclus dans la précédente 2008 de SQL Server version du correctif.

Symptômes

Considérez le scénario suivant :
  • Vous disposez de Microsoft SQL Server 2008 est installé sur un ordinateur multiprocesseur.
  • Vous avez une instruction INSERT SELECT sur une table qui contient une clé primaire.

    Remarque Dans l’instruction INSERT SELECT , la table qui reçoit les données est la table qui renvoie les données. Par exemple :
    INSERT T1 … SELECT T1
  • Vous référencez les autres tables dans l’instruction INSERT SELECT . Ces références incluent une table temporaire.

    Remarque Les tables sont référencées dans la clause FROM , ou les tables sont référencées dans une condition de jointure ou de sous-requête.
Lorsque vous exécutez l’instruction, le message d’erreur suivant s’affiche :

Msg 2627, niveau 14, état 1

Violation de la contrainte de clé primaire 'PrimaryKey'. Impossible d’insérer une clé en double dans l’objet 'nom_table'.

Si vous examinez le plan d’exécution, vous trouvez que l’opérateur JOIN et l’opérateur Eager Spool s’exécuter en parallèle. Cet opérateur Eager Spool se trouve sous l’opérateur JOIN . En outre, la table qui reçoit les données dans l’instruction est la table interne de la jointure.

Remarque Ce problème se produit également lorsque vous exécutez l'instruction UPDATE SELECT ou l'instruction DELETE SELECT .

Cause

Ce problème se produit en raison d’un bogue dans la file d’attente pour l’opérateur Eager Spool où la file d’attente génère plus de lignes que prévu. Ce comportement provoque un problème de clé en double.

Résolution

Informations de mise à jour cumulative


Le correctif de ce problème a été publié dans à jour Cumulative 3 pour SQL Server 2008 Service Pack 1. Pour plus d’informations sur ce package de mise à jour cumulative, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :
971491 Cumulative mise à jour 3 pour Microsoft SQL Server 2008 Service Pack 1
Remarque Les versions étant cumulatives, chaque nouvelle version du correctif contient tous les correctifs et correctifs de sécurité inclus dans la précédente version du correctif de SQL Server 2008. Microsoft vous recommande l’application la plus récente version du correctif qui comprendra ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
970365 the SQL Server versions 2008 publiées après SQL Server 2008 Service Pack 1
Les correctifs Microsoft SQL Server 2008 sont créés pour les packs de service spécifiques de SQL Server. Vous devez appliquer un correctif SQL Server 2008 Service Pack 1 dans une installation de SQL Server 2008 Service Pack 1. Par défaut, tout correctif qui est fourni dans un service pack de SQL Server est inclus dans le prochain service pack de SQL Server.

Informations sur le correctif

Un correctif pris en charge est désormais disponible auprès de Microsoft. Toutefois, il est conçu pour résoudre uniquement le problème décrit dans cet article. Il s’applique uniquement aux systèmes rencontrant ce problème spécifique. Ce correctif peut subir des tests supplémentaires. Par conséquent, si vous n’êtes pas sérieusement concerné par ce problème, nous vous recommandons d’attendre le prochain service pack de SQL Server 2008 qui comprendra ce correctif.

Pour résoudre ce problème immédiatement, contactez les Services de Support technique Microsoft pour obtenir le correctif. Pour obtenir une liste complète des numéros de téléphone des Services de Support technique Microsoft et des informations sur les coûts de support, visitez le site Web de Microsoft à l’adresse suivante :Remarque Dans des cas particuliers, des frais généralement encourus pour les appels au support technique peuvent être annulés si un technicien du support technique Microsoft détermine qu'une mise à jour spécifique peut résoudre votre problème. Les coûts habituels du support technique s’appliqueront aux autres questions et problèmes qui ne relèvent pas de la mise à jour spécifique en question.

Conditions préalables

Pour appliquer ce correctif, vous devez disposer d’un ordinateur qui exécute SQL Server 2008 Service Pack 1 (SP1).

Informations sur le redémarrage

Vous n’êtes pas obligé de redémarrer l’ordinateur après avoir appliqué ce correctif.

Informations concernant le Registre

Vous n’êtes pas obligé de modifier le Registre.

Informations sur les fichiers de correctif logiciel

Ce correctif contient uniquement les fichiers qui sont nécessaires pour corriger les problèmes décrits dans cet article. Ce correctif ne peut pas contenir tous les fichiers nécessaires à la mise à jour complète d’un produit vers la dernière version.

La version anglaise de ce correctif dispose des attributs de fichier (ou version ultérieure) répertoriés dans le tableau suivant. Les dates et heures de ces fichiers sont répertoriées en temps universel coordonné (UTC). Lorsque vous affichez les informations de fichier, elles sont converties en heure locale. Pour trouver la différence entre l’UTC et l’heure locale, utilisez l’onglet fuseau horaire dans l’élément de Date et heure dans le panneau de configuration.
Pour toutes les versions basées sur les x86 du moteur de base de données SQL Server 2008
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Sqlaccess.dll2007.100.2712.0405,35213-May-200917:53x86
Keyfile.dll2007.100.2712.013,65613-May-200915:37x86
Sqlservr.exe2007.100.2712.042,729,32013-May-200917:56x86
Pour toutes les versions basées sur les x86 de SQL Server 2008 Analysis Services
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Msmdlocal.dll10.0.2712.023,461,72013-May-200916:08x86
Msmdsrv.exe10.0.2712.021,955,41613-May-200916:09x86
Keyfile.dll2007.100.2712.013,65613-May-200915:37x86
Msmdpump.dll10.0.2712.06,180,69613-May-200916:08x86
Msmdspdm.dll10.0.2712.0178,00813-May-200916:08x86
Msmgdsrv.dll10.0.2712.08,558,93613-May-200916:09x86
Msolap100.dll10.0.2712.06,532,95213-May-200916:09x86
Pour toutes les versions basées sur les x64 du moteur de base de données SQL Server 2008
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Sqlaccess.dll2007.100.2712.0412,00814-May-200901:15x86
Keyfile.dll2007.100.2712.014,18413-May-200923:55x64
Sqlservr.exe2007.100.2712.057,873,25614-May-200901:17x64
Pour toutes les versions basées sur les x64 de SQL Server 2008 Analysis Services
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Msmdlocal.dll10.0.2712.023,461,72013-May-200916:08x86
Msmdlocal.dll10.0.2712.044,436,82414-May-200900:10x64
Msmdsrv.exe10.0.2712.043,713,36814-May-200900:10x64
Keyfile.dll2007.100.2712.014,18413-May-200923:55x64
Msmdpump.dll10.0.2712.07,430,48814-May-200900:10x64
Msmdspdm.dll10.0.2712.0178,02414-May-200900:10x86
Msmgdsrv.dll10.0.2712.08,558,93613-May-200916:09x86
Msmgdsrv.dll10.0.2712.012,332,37614-May-200900:11x64
Msolap100.dll10.0.2712.06,532,95213-May-200916:09x86
Msolap100.dll10.0.2712.08,153,94414-May-200900:11x64
Pour toutes les versions Itanium et prise en charge du moteur de base de données SQL Server 2008
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Sqlaccess.dll2007.100.2712.0398,69613-May-200917:01x86
Keyfile.dll2007.100.2712.019,30413-May-200915:26IA-64
Sqlservr.exe2007.100.2712.0111,042,40813-May-200917:08IA-64
Pour toutes les versions Itanium et prise en charge de SQL Server 2008 Analysis Services
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
Msmdlocal.dll10.0.2712.023,461,72013-May-200916:08x86
Msmdlocal.dll10.0.2712.057,508,18413-May-200915:44IA-64
Msmdsrv.exe10.0.2712.058,860,88813-May-200915:46IA-64
Keyfile.dll2007.100.2712.019,30413-May-200915:26IA-64
Msmdpump.dll10.0.2712.08,943,44813-May-200915:45IA-64
Msmdspdm.dll10.0.2712.0178,00813-May-200915:45x86
Msmgdsrv.dll10.0.2712.015,485,80013-May-200915:47IA-64
Msmgdsrv.dll10.0.2712.08,558,93613-May-200916:09x86
Msolap100.dll10.0.2712.010,065,24013-May-200915:47IA-64
Msolap100.dll10.0.2712.06,532,95213-May-200916:09x86

Solution de contournement

Pour contourner ce problème, définissez l’indicateur de requête MAXDOP ou l’option MAXDOP 1 au niveau du serveur ou de l’instruction.

Remarque Le niveau serveur option MAXDOP affecte les performances de toutes les requêtes qui s’exécutent sur le serveur.

État

Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».

Références

Pour plus d’informations sur le modèle de service incrémentiel pour SQL Server, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :

935897 un modèle de service incrémentiel est disponible auprès de l’équipe SQL Server pour proposer des correctifs pour les problèmes signalés



Pour plus d’informations sur le schéma d’appellation des mises à jour de SQL Server, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :

822499 Nouveau schéma d’affectation de noms pour les packages de mise à jour logicielle de Microsoft SQL Server


Pour plus d'informations sur la terminologie de mise à jour logicielle, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
Description 824684 terminologie standard utilisée pour décrire les mises à jour logicielles de Microsoft
Propriétés

ID d'article : 970507 - Dernière mise à jour : 14 janv. 2017 - Révision : 1

Commentaires