CORRECTIF : une instruction de fusion et PUBLIPOSTAGE peut impose pas une contrainte de clé étrangère lorsque l'instruction met à jour une colonne de clé unique qui ne fait pas partie d'une clé de clustering et présente une seule ligne en tant que source de mise à jour dans SQL Server 2008

Traductions disponibles Traductions disponibles
Numéro d'article: 956718 - Voir les produits auxquels s'applique cet article
Bogue #: 50003167 (correctifs SQL)
Pour plus d'informations la liste principale des builds publiés après que SQL a été publié, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances :
957826 Où vous trouverez plus d'informations sur SQL Server 2008 versions publiées après SQL Server 2008 et SQL Server 2005 crée publiées après SQL Server 2005 Service Pack 2
Agrandir tout | Réduire tout

Symptômes

Dans Microsoft SQL Server 2008, une contrainte de clé étrangère peut ne pas être appliquée lorsque les conditions suivantes sont vraie :
  • Une instruction de fusion et PUBLIPOSTAGE est émise.
  • La colonne cible de la mise à jour a un index unique non cluster.
Envisagez le scénario suivant. L'instruction met à jour une colonne unique qui est nommée Column1 d'une table qui est nommée Table1. Table1 est référencée par une contrainte de clé étrangère d'une table nommée Table2.

Le résultat est que les lignes dans la Table1 sont modifiés lorsque qu'ils ne doivent pas ont été. En outre, Table2 va avoir des lignes qui ont dangling références à Table1.

Ce problème se produit pour ce scénario lorsque les conditions suivantes sont remplies :
  • La colonne Column1 référencée dans la Table1 n'est pas partie de la clé de clustering de Table1.
  • Valeur possible qu'une seule peut être affectée à la colonne Column1. Le par exemple, un des scénarios suivants se produit :
    • La source de fusion et publipostage est une seule ligne de données. Par exemple, la source de fusion est parmi les instructions select suivantes :
      • select <ConstantValues>
      • select <Parameters>
      note Ce scénario est le scénario plus probable.
    • La source de fusion et publipostage est en fait une seule ligne de données. Par exemple, la source de fusion est parmi les instructions select suivantes :
      • select <ColumnName> from <TableName> where <TableName>.<ColumnName> = 1
        note <TableName>. <ColumnName>est connu par l'optimiseur de requête pour être une valeur unique.
      • select top 1 <ColumnName> from <TableName>
    • La jointure entre la source de fusion et publipostage et la cible de fusion et publipostage est un prédicat qui garantit qu'une seule ligne sera mis à jour.
    • La clause de mise à jour définit la colonne Column1 sur une valeur constante, indépendamment de la source de fusion et publipostage.
  • L'option en cascade de mise à jour n'est pas activée sur la contrainte de clé étrangère dans Table2.
note Nous vous recommandons d'appliquer ce correctif si vous utilisez l'instruction de fusion et PUBLIPOSTAGE pour mettre à jour des colonnes ayant des index non cluster uniques qui sont référencés par les contraintes de clé étrangère.

Résolution

Le correctif de ce problème a été tout d'abord publié en mise à jour cumulatif 1. Pour plus d'informations sur la façon d'obtenir ce package de mise à jour cumulative pour SQL Server 2008, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
956717 Package de cumulative mise à jour 1 pour SQL Server 2008
note Les versions étant cumulatifs, chaque nouvelle version de correctif contient tous les correctifs et tous les correctifs de sécurité qui étaient fournis avec la précédente SQL Server 2008 version du correctif. Nous vous recommandons de prendre en compte Application de la version de correctif plus récente 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 :
956909 SQL Server 2008 versions publiées après le lancement de SQL Server 2008

Contournement

Le package de correctifs élimine le problème. Si vous utilisez l'instruction de fusion et PUBLIPOSTAGE dans le scénario décrit dans la section « Symptômes » et si vous choisissez de ne pas appliquer le correctif, procédez comme suit pour éliminer ce problème :
  1. Réécrivez l'instruction de fusion et PUBLIPOSTAGE afin que les valeurs de la source de fusion et publipostage se trouvent dans une table, une table temporaire ou une variable de table au lieu d'être en aligné de la requête.
  2. Utilisez l'indicateur de suivi 8790. Cet indicateur de suivi force l'optimiseur d'utiliser un type de plan qui est appelée un plan de mise à jour de large. Plans de largeur de la mise à jour est inutile du problème. Cette étape comporte des risques de performances de toutes les instructions DML. Par conséquent, évitez d'utiliser cette étape que s'il est impossible de modifier l'application.
Le script Transact-SQL suivant montre une façon pour modifier votre script pour résoudre ce problème si vous ne pouvez pas appliquer ce correctif.

Par exemple, vous disposez d'un script semblable au suivant :
use tempdb;

drop table sale, product;
create table product(pno int not null primary key, name char(30), pAlternateKey char(6) not null unique);
create table sale(sno int not null primary key, pAlternateKey char(6) not null references product(pAlternateKey));
insert product values(1, 'Office Chair', 'ochair');
insert sale values(1, 'ochair')

-- No violation of foreign key constraint is detected. However, one should be.
merge into product
using (select 'Office Chair2' as name, 1 as pno, 'oxx' as pAlternateKey) as src
on product.pno = src.pno
when matched then
   update set product.pAlternateKey = src.pAlternateKey, 
              product.name = src.name
when not matched then
   insert values(src.pno, src.name, src.pAlternateKey);
Fusion en produit en (sélectionnez « Office Chair2 » comme nom de 1, comme pno, oxx comme pAlternateKey) src sur product.pno = src.pno lorsque assorti puis mettre à jour ensemble product.pAlternateKey = src.pAlternateKey, product.name = src.name lorsque sans correspondance puis insérer des valeurs (src.pno src.name, src.pAlternateKey); modifier le script afin qu'il ressemble à celui-ci :
insert product values(1, 'Office Chair', 'ochair');
insert sale values(1, 'ochair')
-- A foreign key constraint violation is detected, and the update fails.
declare @source table 
   (name nchar(30), pno int, pAlternateKey nchar(30));
insert into @source values('Office Chair2',1,'oxx');

merge into product
using @source as src
on product.pno = src.pno
when matched then
   update set product.pAlternateKey = src.pAlternateKey, 
              product.name = src.name
when not matched then
   insert values(src.pno, src.name, src.pAlternateKey);
déclarer table @source (nom nchar(30), les pno int, les pAlternateKey nchar(30)) ; Insertion en valeurs @source (« Office Chair2', 1, « oxx »); fusion en produit utilisant @source comme src sur product.pno = src.pno lorsque assorti puis mettre à jour ensemble product.pAlternateKey = src.pAlternateKey, product.name = src.name lorsque sans correspondance puis insérer des valeurs (src.pno src.name, src.pAlternateKey) ;

Statut

Microsoft a confirmé que c'est un problème dans les produits Microsoft répertoriés dans la section « S'applique à ».

Plus d'informations

Pour plus d'informations sur les fichiers sont modifiés et pour des informations sur les conditions préalables pour appliquer le package de mise à jour cumulative qui contient le correctif qui est décrit dans cet article de la base de connaissances Microsoft, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
956717 Package de cumulative mise à jour 1 pour SQL Server 2008

Références

Pour plus d'informations sur la liste des builds sont disponibles après la version de SQL Server 2008, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
956909 SQL Server 2008 versions publiées après le lancement de SQL Server 2008


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émentielle est disponible auprès de l'équipe SQL Server pour fournir des correctifs pour les problèmes signalés


Pour plus d'informations sur le schéma d'appellation des mises à jour SQL Server, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
822499 Nouveau modèle d'affectation de noms pour les packages de correctifs logiciels Microsoft SQL Server


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

Références

Pour plus d'informations sur les index non cluster dans SQL Server 2008, reportez-vous au site de Web MSDN (Microsoft Developer Network) suivant :
http://msdn.microsoft.com/en-us/library/ms179325(SQL.100).aspx

Propriétés

Numéro d'article: 956718 - Dernière mise à jour: vendredi 19 septembre 2008 - Version: 4.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Standard Edition for Small Business
  • Microsoft SQL Server 2008 Web
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Express with Advanced Services
Mots-clés : 
kbmt kbautohotfix kbhotfixserver kbqfe kbpubtypekc kbfix KB956718 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 956718
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com