SQL Server: как заставить сервер проверять все свои ограничения проверки?

Кажется, что некоторые сценарии, сгенерированные Enterprise Manager* (или нет, это не имеет значения), создали ограничения проверки с помощью NOCHECK.

Теперь, когда кто-нибудь изменяет таблицу, SQL Server сталкивается с неудачными проверочными ограничениями и выдает ошибки.

Могу ли я заставить SQL пройти через все проверочные ограничения и проверить их?

Бег:

sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

включает только ранее отключенные проверочные ограничения, но фактически не проверяет их.

Сноски

* SQL Server 2000

3 ответа

Решение

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

Нашел это:

Проверяет все ограничения для всех таблиц в текущей базе данных, независимо от того, включено ли ограничение:

DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS

Чтобы проверить только включенные ограничения:

DBCC CHECKCONSTRAINTS

Сделай это:

ALTER TABLE dbo.Test
      WITH CHECK CHECK CONSTRAINT CK_Test;

Пояснение: Можете ли вы доверять своим ограничениям?