KB4503379 - CORRECTIF : les contraintes d’intégrité référentielle ne sont pas évaluées correctement lorsque le plan d’exécution de requête utilise l’opérateur de vérification des références de clé étrangère dans SQL Server 2016 et 2017

S’applique à
SQL Server 2017 Developer Windows SQL Server 2017 Enterprise Windows SQL Server 2017 Enterprise Core Windows SQL Server 2017 Standard Windows

Symptômes

Supposons que vous essayez de supprimer des données d’une table et que les données sont référencées dans d’autres tables dans Microsoft SQL Server 2016 et 2017. Si vous explorez le plan d’exécution de requête, vous pouvez voir qu’il utilise un opérateur de vérification des références de clé étrangère. Dans ce cas, vous pouvez recevoir le message d’erreur suivant même si la ligne en cours de suppression n’est pas référencée dans d’autres tables :

Msg 547, Niveau 16, État 0, Ligne LineNumber

L’instruction DELETE était en conflit avec la contrainte REFERENCE

État

Microsoft a confirmé qu’il s’agissait d’un problème dans les produits Microsoft répertoriés dans la section « S’applique à ».

Résolution

Ce problème est résolu dans la mise à jour cumulative suivante pour SQL Server :

Remarque Ce problème est résolu dans la mise à jour cumulative 6 pour SQL Server 2016 SP2.

À propos des mises à jour cumulatives pour SQL Server :

Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs logiciels et tous les correctifs de sécurité inclus dans la mise à jour cumulative précédente. Consultez les dernières mises à jour cumulatives pour SQL Server :

Solution de contournement

Pour contourner ce problème, appliquez l'une des méthodes suivantes :

  • Utilisez un niveau de compatibilité inférieur à 130 pour exécuter cette requête.
  • Modifiez la structure de l’index sur la table de référencement.

Informations supplémentaires

À partir du niveau de compatibilité de la configuration étendue de la base de données 130 dans SQL Server 2016, un plan d’exécution de requête peut utiliser l’opérateur de vérification des références de clé étrangère pour vérifier si une ligne d’une table est référencée par des lignes d’autres tables via des contraintes d’intégrité référentielle. Cet opérateur peut être utilisé si une table est référencée par un grand nombre de tables étrangères. Dans cet opérateur, SQL Server choisit un index dans chaque table de référencement pour effectuer cette case activée. Si une table de référencement possède un index avec plusieurs colonnes de clé, certaines colonnes figurant au début ne font pas partie de la clé étrangère, mais d’autres colonnes font partie de la clé étrangère. Cela peut entraîner une case activée incorrecte effectuée par SQL Server.

Par exemple, considérez le schéma suivant :

Créer une table TPK (PK Int Constraint CPK Primary Key Clustered)

CREATE TABLE TFK (A INT, FK INT CONSTRAINT CFK FOREIGN KEY REFERENCES TPK, INDEX IA CLUSTERED(A,FK))

Un tel schéma peut entraîner ce problème, mais si vous remplacez l’ordre des colonnes de l’index ia par (fk,a), ce ne sera pas le cas.

Références

En savoir plus à propos de la terminologie utilisée par Microsoft pour décrire les mises à jour logicielles.