ALTER TABLE CHECK CONTRAINT

25

À partir de l'Explorateur d'objets dans SQL Server, lors de la sélection et du script d'une contrainte de clé étrangère, le code suivant est généré.

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

Quel est le but de la dernière instruction "ALTER TABLE CHECK CONSTRAINT"? Peu importe qu'il soit exécuté ou non. Il n'échoue pas sur les mauvaises données existantes, ni ne change que la contrainte sera appliquée sur les nouvelles données.

Merci!

Delux
la source

Réponses:

23

Il garantit que la contrainte est activée après sa création. Votre ALTER TABLEdéclaration comprend WITH NOCHECKquelle est la pièce qui dit de ne pas vérifier les mauvaises données existantes lors de la création de la contrainte.

Comme écrit, les données existantes ne seront pas vérifiées par rapport à la contrainte en raison de WITH NOCHECKdans la première instruction. L'émission de la deuxième instruction permettra la vérification par rapport à la contrainte pour toute modification future de la table qui est couverte par la contrainte, jusqu'au point où un ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]est émis.

Les instructions, telles qu'elles sont écrites, disent essentiellement "Créez cette contrainte de clé étrangère mais ne la comparez pas aux données existantes. Rendez-la active pour toute modification à venir des données."

squillman
la source
En fait, j'ai vérifié cela, cela ne fait aucune différence s'il y a de mauvaises données, la première ou la deuxième ligne n'échouera pas. Pour faire avec un échec, ils devraient ressembler à ceci:
Delux
2
ALTER TABLE [dbo]. [T2] AVEC CHECK CHECK CONSTRAINT [FK_T2_T1]
Delux
Droite. Mais vous verrez qu'il échouera après cela quand, à un moment donné, vous essayez d'exécuter un INSERT ou une UPDATE qui viole la contrainte. Aucun échouera si de mauvaises données existent au moment où ces 2 instructions sont exécutées.
squillman
7

Votre première instruction crée une contrainte désactivée. Il doit être activé et éventuellement approuvé. La syntaxe étrange suivante s'assurera que votre contrainte est activée et approuvée:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Il y a un très bon article de blog par Hugo Kornelis qui l'explique en détail: pouvez-vous faire confiance à vos contraintes

AK
la source