SQL Server: Jak sprawić, by serwer sprawdzał wszystkie jego ograniczenia?

Wydaje się, że niektóre skrypty generowane przez Enterprise Manager * (lub nie, to nie ma znaczenia) stworzyły check constraints z NOCHECK .

Teraz, gdy ktoś modyfikuje tabelę, SQL Server natrafia na nieudane ograniczenia czeków i wyrzuca błędy.

Czy Mogę sprawić, że SQL przejdzie przez wszystkie ograniczenia sprawdzania i je sprawdzi?

Running:

sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Włącza tylko wcześniej wyłączone ograniczenia sprawdzania, nie sprawdza oni.

Przypisy

* SQL Server 2000

Author: Arulkumar, 2009-07-08

3 answers

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS nie sprawi, że Twoje ograniczenia będą zaufane. Zgłosi wszelkie wiersze, które naruszają ograniczenia. Aby faktycznie wszystkie Twoje ograniczenia były zaufane, możesz wykonać następujące czynności:

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

W SQL Server 2000 Można znaleźć wszelkie niezaufane ograniczenia za pomocą:

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

Ograniczenia są następnie ponownie przekierowywane z zaznaczeniem :

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

Uwaga : na ostatnim stwierdzeniu {[3] } nie jest literówką. "Z czekiem" sprawdzi wszystkie dane tabeli, aby upewnić się, że nie ma naruszeń i sprawi, że ograniczenie będzie zaufane, podczas gdy sprawdzenie upewni się, że ograniczenia są włączone.

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

 48
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 20:51:03

Znaleziono :

Sprawdza wszystkie ograniczenia we wszystkich tabelach w bieżącej bazie danych, czy ograniczenie jest włączone, czy nie:

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS

Aby sprawdzić tylko włączone ograniczenia:

DBCC CHECKCONSTRAINTS
 8
Author: Ian Boyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-15 13:06:18

Zrób to:

ALTER TABLE dbo.Test
      WITH CHECK CHECK CONSTRAINT CK_Test;

Wyjaśnienie: Czy możesz zaufać swoim ograniczeniom?

 3
Author: A-K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-08 14:59:47