SQL Server: comment faire pour que le serveur vérifie toutes ses contraintes de vérification?

il semble que certains scripts générés par Enterprise Manager* (ou non, cela n'a pas d'importance) ont créé des contraintes de vérification AVEC NOCHECK.

Maintenant, quand quelqu'un modifie la table, SQL Server est en train de trébucher sur des contraintes de vérification qui ont échoué, et des erreurs de lancement.

puis-je faire passer en revue toutes les contraintes de contrôle de SQL, et les vérifier?

Fonctionnement:

sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

n'active que les contraintes de vérification préalablement désactivées, il ne fait pas les vérifier.

Notes de bas de page

* SQL Server 2000

24
demandé sur Arulkumar 2009-07-08 18:47:05

3 réponses

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS ne fera pas vraiment confiance à vos contraintes. Il signalera toutes les lignes qui violent les contraintes. Pour faire réellement confiance à toutes vos contraintes, vous pouvez faire ce qui suit:

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS --This reports any data that violates constraints.

--This reports all constraints that are not trusted
SELECT OBJECT_NAME(parent_object_id) AS table_name, name, is_disabled  
FROM sys.check_constraints 
WHERE is_not_trusted = 1
UNION ALL
SELECT OBJECT_NAME(parent_object_id) AS table_name, name, is_disabled  
FROM sys.foreign_keys
WHERE is_not_trusted = 1
ORDER BY table_name

dans SQL Server 2000 vous pouvez trouver des contraintes non fiables avec:

--Reports all constraints that are not trusted (SQL 2000)
SELECT name, type, status,
    (status & 2048) AS IsTrusted,
    (status & 256) AS IsEnabled,
    OBJECTPROPERTY(id,'CnstIsNotTrusted') as is_not_trusted,
    OBJECTPROPERTY(id,'CnstIsDisabled') as is_disabled
FROM sysobjects 
WHERE type IN ('C', 'F') --C=Constraint, F=Foreign Key
AND OBJECTPROPERTY(id,'CnstIsNotTrusted') <> 0
AND OBJECTPROPERTY(id,'CnstIsDisabled') = 0

les contraintes sont alors rétablies avec contrôle:

--This makes all constraints trusted
-- but first anything reported by DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS must be fixed.
exec sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'

Remarque:: le dernier déclaration, le WITH CHECK CHECK n'est pas une faute de frappe. Le "avec contrôle" vérifiera toutes les données de la table pour s'assurer qu'il n'y a pas de violations, et fera confiance à la contrainte, tandis que le contrôle s'assurera que les contraintes sont activées.

Voir aussi: http://sqlblog.com/blogs/tibor_karaszi/archive/2008/01/12/non-trusted-constraints.aspx

http://sqlblog.com/blogs/tibor_karaszi/archive/2008/01/12/non-trusted-constraints-and-performance.aspx

48
répondu Nathan 2012-11-16 20:51:03

Trouvé:

Vérifie toutes les contraintes sur toutes les tables dans la base de données actuelle, si la contrainte est activée ou non:

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS

À vérifier seulement permis à des contraintes:

DBCC CHECKCONSTRAINTS
8
répondu Ian Boyd 2012-02-15 13:06:18

faire ceci:

ALTER TABLE dbo.Test
      WITH CHECK CHECK CONSTRAINT CK_Test;

Explication: Pouvez-vous faire confiance à vos contraintes?

3
répondu A-K 2009-07-08 14:59:47