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
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
faire ceci:
ALTER TABLE dbo.Test
WITH CHECK CHECK CONSTRAINT CK_Test;
Explication: Pouvez-vous faire confiance à vos contraintes?