J'ai une database SQL Server 2012 avec une contrainte de key étrangère qui fait reference à Counsortinges.CountryID = States.CountryID
J'avais besoin de recréer la table des Counsortinges
pour que je renonce à cette key étrangère depuis la table des States
(sinon cela ne me permettrait pas d'abandonner les pays)
Après avoir fait cela, je veux recréer le FK sur les States
mais il ne me le permet pas à less que je ne spécifie NO CHECK
comme tel:
ALTER TABLE States WITH NOCHECK ADD CONSTRAINT FK_StatesCounsortinges FOREIGN KEY (CountryID) REFERENCES Counsortinges(CountryID) GO
Au début, je n'avais pas réalisé que certaines des rangées d'États avaient un CountryID
qui n'avait pas de CountryID
Counsortinges.CountryID
correspondant. De toute évidence WITH NOCHECK
m'a permis de procéder sans erreur.
Maintenant SQLServer avec marquer ce FK comme "non approuvé", MSDN dit de réactiver l'optimiseur de requête en vérifiant toutes les contraintes. Alors pourquoi est-ce que la ligne suivante ne me donne pas une erreur même si certains Etats ont un CountryID invalide?
ALTER TABLE States CHECK CONSTRAINT ALL GO
Je pense que cela aurait dû soulever une erreur.
Pour rétablir la confiance des contraintes, vous devez utiliser cette syntaxe, qui semble être un peu étrange. Le WITH CHECK
est ce qui provoque la validation des données existantes.
ALTER TABLE States WITH CHECK CHECK CONSTRAINT ALL GO
Comme précédemment, cela génère une erreur jusqu'à ce que vous résolviez les états avec de mauvaises valeurs CountryID.