2010-09-28 4 views
8

Je viens d'apprendre, à ma grande surprise, que les contraintes de clé étrangère peuvent ne pas être fiables. Cela se produit lorsqu'une contrainte est ajoutée en utilisant WITH NOCHECK. Lorsqu'une contrainte n'est pas approuvée, elle n'est pas utilisée par l'analyseur de requête pour la génération du plan de requête.Contraintes non approuvées

Voir:
http://sqlblog.com/blogs/hugo_kornelis/archive/2007/03/29/can-you-trust-your-constraints.aspx

Ma question est la suivante. Quand une contrainte est non-fiable, y a-t-il une propriété sur la contrainte que je peux inspecter qui me dit cela? Je suppose que je pourrais vérifier pour voir si la contrainte a été ajoutée en utilisant WITH NOCHECK, mais existe-t-il d'autres façons qu'une contrainte puisse être signalée comme non approuvée?

Répondre

4
select * 
    from sys.check_constraints 
    where is_not_trusted = 1 

select * 
    from sys.foreign_keys 
    where is_not_trusted = 1 
1

Oui there is a property on the constraint accessible par la fonction OBJECTPROPERTY.

SELECT 
    CASE WHEN OBJECTPROPERTY(OBJECT_ID('FK_TIMECARD_EMPLOYEEID'), 'CnstIsNotTrusted') = 1 
     THEN 'NO' 
     ELSE 'YES' 
     END AS 'IsTrustWorthy?'