SQL Server:如何使服务器检查其所有检查约束?

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'

注:在最后一条语句中,WITH CHECK CHECK不是拼写错误。"WITH CHECK"将检查所有表数据以确保没有冲突,并将使约束可信,而检查将确保启用约束。

参见: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;

解释:你能相信你的约束吗?