SQL Server: How to make server check all its check constraints?
似乎由EnterpriseManager*生成的一些脚本(或者不重要)使用nocheck创建了检查约束。
现在,当任何人修改表时,SQL Server都会遇到失败的检查约束,并抛出错误。
我可以让SQL遍历所有的检查约束并检查它们吗?
运行:
1 | sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all' |
只启用以前禁用的检查约束,而不实际检查它们。
脚注*SQL Server 2000
带有所有约束的DBCC CHECKCONSTRAINTS实际上不会使您的约束可信。它将报告任何违反约束的行。要使所有约束都可信,可以执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 | 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 |
在SQL Server 2000中,可以找到任何不受信任的约束:
1 2 3 4 5 6 7 8 9 10 | --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 |
然后通过检查重新启用约束:
1 2 3 | --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' |
注:在最后一条语句中,
参见:http://sqlbog.com/blogs/tibor_karaszi/archive/2008/01/12/non-trusted-constraints.aspx
http://sqlbog.com/blogs/tibor_karaszi/archive/2008/01/12/non-trusted-constraints-and-performance.aspx
找到它:
检查当前数据库中所有表上的所有约束,无论是否启用该约束:
1 | DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS |
要仅检查启用的约束:
1 | DBCC CHECKCONSTRAINTS |
这样做:
1 2 | ALTER TABLE dbo.Test WITH CHECK CHECK CONSTRAINT CK_Test; |
解释:你能相信你的约束吗?