Я смотрю образец базы данных AdventureWorks для SQL Server 2008 и вижу в их сценариях создания, что они, как правило, используют следующее:
ALTER TABLE [Production].[ProductCostHistory] WITH CHECK ADD
CONSTRAINT [FK_ProductCostHistory_Product_ProductID] FOREIGN KEY([ProductID])
REFERENCES [Production].[Product] ([ProductID])
GO
сразу после этого:
ALTER TABLE [Production].[ProductCostHistory] CHECK CONSTRAINT
[FK_ProductCostHistory_Product_ProductID]
GO
Я вижу это для внешних ключей (как здесь), уникальных ограничений и обычных CHECK
ограничений; DEFAULT
ограничения используют обычный формат, с которым я более знаком, например:
ALTER TABLE [Production].[ProductCostHistory] ADD CONSTRAINT
[DF_ProductCostHistory_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
В чем разница между первым и вторым способами?
источник
ALTER TABLE foo NOCHECK CONSTRAINT fk_b
а затем снова включите его,ALTER TABLE foo CHECK CONSTRAINT fk_b
это не проверяет ограничение.ALTER TABLE foo WITH CHECK CHECK CONSTRAINT fk_b
необходимо для проверки данных.Чтобы продемонстрировать, как это работает -
источник
DROP TABLE T2; DROP TABLE T1;
В дополнение к вышеприведенным отличным комментариям о надежных ограничениях:
Недоверяемому ограничению, как следует из его названия, нельзя доверять, чтобы точно представлять состояние данных в таблице прямо сейчас. Однако можно, но можно доверять проверке данных, добавляемых и изменяемых в будущем.
Кроме того, оптимизатор запросов игнорирует ненадежные ограничения.
Код для включения ограничений проверки и ограничений внешнего ключа довольно плох, с тремя значениями слова «проверка».
источник
WITH NOCHECK
также используется, когда в таблице есть существующие данные, которые не соответствуют определенному ограничению, и вы не хотите, чтобы оно противоречило новому ограничению, которое вы реализуете ...источник
WITH CHECK
действительно является поведением по умолчанию, однако рекомендуется включать его в код.Разумеется, следует использовать альтернативное поведение
WITH NOCHECK
, поэтому желательно четко определить свои намерения. Это часто используется, когда вы играете / изменяете / переключаете встроенные разделы.источник
Ограничения внешнего ключа и проверки имеют понятие «доверенные» или «ненадежные», а также могут быть включены и отключены. См. Страницу MSDN для
ALTER TABLE
получения полной информации.WITH CHECK
используется по умолчанию для добавления нового внешнего ключа и проверки ограничений,WITH NOCHECK
является значением по умолчанию для повторного включения отключенного внешнего ключа и проверочных ограничений. Важно понимать разницу.Сказав это, любые явно избыточные операторы, генерируемые утилитами, просто существуют для безопасности и / или простоты кодирования. Не беспокойся о них.
источник
WITH CHECK CHECK CONSTRAINT
чтобы им доверяли.select * from sys.objects where [type] in ('C', 'F') and (objectproperty([object_id], 'CnstIsDisabled') = 1 or objectproperty([object_id], 'CnstIsNotTrusted') = 1)
чтобы найти отключенные и ненадежные ограничения. После выполнения соответствующих операторов alter table, как указано выше, эти ограничения исчезают из запроса, поэтому я могу видеть, как он работает.Вот код, который я написал, чтобы помочь нам определить и исправить ненадежные ОГРАНИЧЕНИЯ в БАЗЕ ДАННЫХ. Он генерирует код для исправления каждой проблемы.
источник