Похоже, что некоторые скрипты, созданные Enterprise Manager * (или нет, это не имеет значения) создали контрольные ограничения WITH NOCHECK.
Теперь, когда кто-либо изменяет таблицу, SQL Server натыкается на неудачные контрольные ограничения и бросает ошибки.
Могу ли я заставить 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
Найдено его:
Проверяет все ограничения на все таблицы в текущей базе данных, независимо от того, включено ли ограничение или нет:
DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS
Чтобы проверить только разрешенные ограничения:
DBCC CHECKCONSTRAINTS
Ответ 3
сделайте следующее:
ALTER TABLE dbo.Test
WITH CHECK CHECK CONSTRAINT CK_Test;
Объяснение: Можете ли вы доверять своим ограничениям?