26

Enterprise Manager *によって生成された一部のスクリプト(またはそうでない場合は関係ありません)は、NOCHECKを使用してチェック制約を作成したようです。

これで、誰かがテーブルを変更すると、SQL Serverは失敗したチェック制約に遭遇し、エラーをスローします。

SQLにすべてのチェック制約を通過させてチェックさせることはできますか?

ランニング:

sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

以前に無効にされたチェック制約のみを有効にし、実際にはチェックしません。

脚注

* SQL Server 2000

4

3 に答える 3

55

ALL_CONSTRAINTSを使用したDBCCCHECKCONSTRAINTS は、実際には制約を信頼できるものにしません。制約に違反する行を報告します。すべての制約を実際に信頼できるようにするには、次のようにします。

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これはタイプミスではありません。「WITHCHECK」は、すべてのテーブルデータをチェックして違反がないことを確認し、制約を信頼できるようにします。チェックにより、制約が有効になっていることを確認します。

参照: 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

于 2009-08-27T15:28:57.070 に答える
8

それを見つけた

制約が有効になっているかどうかに関係なく、現在のデータベース内のすべてのテーブルのすべての制約をチェックします。

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS

有効な制約のみを確認するには:

DBCC CHECKCONSTRAINTS
于 2009-07-08T15:15:58.487 に答える
4

これを行う:

ALTER TABLE dbo.Test
      WITH CHECK CHECK CONSTRAINT CK_Test;

説明:制約を信頼できますか?

于 2009-07-08T14:59:47.160 に答える