Je regarde l'exemple de base de données AdventureWorks pour SQL Server 2008 et je vois dans leurs scripts de création qu'ils ont tendance à utiliser les éléments suivants:
ALTER TABLE [Production].[ProductCostHistory] WITH CHECK ADD
CONSTRAINT [FK_ProductCostHistory_Product_ProductID] FOREIGN KEY([ProductID])
REFERENCES [Production].[Product] ([ProductID])
GO
suivi immédiatement par:
ALTER TABLE [Production].[ProductCostHistory] CHECK CONSTRAINT
[FK_ProductCostHistory_Product_ProductID]
GO
Je vois cela pour les clés étrangères (comme ici), les contraintes uniques et les CHECK
contraintes régulières ; DEFAULT
les contraintes utilisent le format régulier que je connais mieux, tel que:
ALTER TABLE [Production].[ProductCostHistory] ADD CONSTRAINT
[DF_ProductCostHistory_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
Quelle est la différence, le cas échéant, entre le faire de la première manière et de la seconde?
la source
ALTER TABLE foo NOCHECK CONSTRAINT fk_b
puis la réactivez avecALTER TABLE foo CHECK CONSTRAINT fk_b
elle ne vérifie pas la contrainte.ALTER TABLE foo WITH CHECK CHECK CONSTRAINT fk_b
est nécessaire pour faire vérifier les données.Pour démontrer comment cela fonctionne -
la source
DROP TABLE T2; DROP TABLE T1;
Suite aux excellents commentaires ci-dessus sur les contraintes de confiance:
Une contrainte non approuvée, comme son nom l'indique, ne peut pas être fiable pour représenter avec précision l'état des données dans la table en ce moment. Il peut cependant, mais peut être fiable, vérifier les données ajoutées et modifiées à l'avenir.
De plus, l'optimiseur de requêtes ne tient pas compte des contraintes non fiables.
Le code pour activer les contraintes de vérification et les contraintes de clé étrangère est assez mauvais, avec trois significations du mot «vérifier».
la source
WITH NOCHECK
est également utilisé lorsque l'on a des données existantes dans une table qui ne sont pas conformes à la contrainte telle que définie et que vous ne voulez pas qu'elle soit contraire à la nouvelle contrainte que vous implémentez ...la source
WITH CHECK
est en effet le comportement par défaut, mais il est recommandé de l'inclure dans votre codage.Le comportement alternatif est bien sûr à utiliser
WITH NOCHECK
, il est donc bon de définir explicitement vos intentions. Ceci est souvent utilisé lorsque vous jouez avec / modifiez / changez de partitions en ligne.la source
Les contraintes de clé étrangère et de vérification ont le concept d'être approuvées ou non approuvées, ainsi que d'être activées et désactivées. Consultez la page MSDN pour plus
ALTER TABLE
de détails.WITH CHECK
est la valeur par défaut pour ajouter une nouvelle clé étrangère et vérifier les contraintes,WITH NOCHECK
est la valeur par défaut pour réactiver la clé étrangère désactivée et vérifier les contraintes. Il est important d'être conscient de la différence.Cela dit, toutes les déclarations apparemment redondantes générées par les utilitaires sont simplement là pour la sécurité et / ou la facilité de codage. Ne t'inquiète pas pour eux.
la source
WITH CHECK CHECK CONSTRAINT
pour leur faire confiance.select * from sys.objects where [type] in ('C', 'F') and (objectproperty([object_id], 'CnstIsDisabled') = 1 or objectproperty([object_id], 'CnstIsNotTrusted') = 1)
pour trouver des contraintes désactivées et non fiables. Après avoir émis les instructions alter table appropriées comme ci-dessus, ces contraintes disparaissent de la requête, donc je peux le voir fonctionner.Voici un code que j'ai écrit pour nous aider à identifier et à corriger les CONTRAINTES non fiables dans une BASE DE DONNÉES. Il génère le code pour résoudre chaque problème.
la source