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

Posted

技术标签:

【中文标题】SQL Server:如何让服务器检查其所有检查约束?【英文标题】:SQL Server: How to make server check all its check constraints? 【发布时间】:2010-11-09 01:43:53 【问题描述】:

Enterprise Manager* 生成的某些脚本似乎创建了检查约束WITH NOCHECK

现在当有人修改表时,SQL Server is stumbling across failed check constraints,并抛出错误。

我可以让 SQL 遍历所有的检查约束并检查它们吗?

跑步:

sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

只启用以前禁用的检查约束,实际上并不检查它们。

脚注

* SQL Server 2000

【问题讨论】:

【参考方案1】:

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS 实际上不会使您的约束受信任。它将报告任何违反约束的行。要真正使您的所有约束都可信,您可以执行以下操作:

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 中,您可以通过以下方式找到任何不受信任的约束:

--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

然后通过检查重新启用约束

--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://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

【讨论】:

【参考方案2】:

Found it:

检查当前数据库中所有表的所有约束,是否启用约束:

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS

仅检查启用的约束:

DBCC CHECKCONSTRAINTS

【讨论】:

【参考方案3】:

这样做:

ALTER TABLE dbo.Test
      WITH CHECK CHECK CONSTRAINT CK_Test;

解释:Can you trust your constraints?

【讨论】:

以上是关于SQL Server:如何让服务器检查其所有检查约束?的主要内容,如果未能解决你的问题,请参考以下文章

如何在sql server中检查所有存储过程是否正常?

如何连接远程sqlserver数据库

如何从多个布尔列中检查至少一个为真或所有列值在 SQL Server 中为假

如何检查 SQL Server CE 数据库的索引?

如何在 SQL Server 中检查调用存储过程

如何在合并数据集之前检查行是不是存在(SQL Server)