SQL Server Check/NoCheck разница в сгенерированных скриптах

Я пытаюсь синхронизировать схемы между различными базами данных. В основном я запускал задачи → Сгенерировать скрипты с помощью SQL Server Management Studio (2005) в обеих базах данных, и я сравниваю вывод с инструментом diff.

По какой-то причине один script добавляет ограничение WITH CHECK и один БЕЗ ПРОВЕРКИ, за которым последуют повторные включения обоих ограничений.

I для первой базы данных, которую я получаю:

ALTER TABLE [dbo].[Profile]  WITH CHECK ADD  CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID])
REFERENCES [dbo].[Organization] ([OrganizationID])
GO
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID]
GO

Вторая база данных генерируется как

ALTER TABLE [dbo].[Profile]  WITH NOCHECK ADD  CONSTRAINT [FK_Profile_OrganizationID] FOREIGN KEY([OrganizationID])
REFERENCES [dbo].[Organization] ([OrganizationID])
GO
ALTER TABLE [dbo].[Profile] CHECK CONSTRAINT [FK_Profile_OrganizationID]
GO

У меня есть два вопроса:

  • Является ли конечный результат тем же? ( Edit: Похоже, что многие люди выбирают только первое утверждение двух сценариев. Меня интересует конечный результат всего сценария.)

  • Если конечный результат тот же, почему Management Studio генерирует их по-разному для разных баз данных?

Ответы

Ответ 1

Конечный результат не то же самое!

SQL Server не будет доверять уникальности FK, если он не проверен. Это означает, что дополнительная обработка необходима, если вы используете столбец в запросе. Короче говоря, вы должны получить SQL Server для проверки столбца, чтобы он считался доверенным.

Что касается того, почему они отличаются от разных серверов, проверьте столбец isnottrusted в sys.foreign_keys. Это может повлиять на то, что генерирует SSMS?

Для получения дополнительной информации об этом, проверьте мой другой ответ, который относится к параметрам FK и NO CHECK/CHECK.

Ответ 2

Да, они два разных сценария

С ПРОВЕРКОЙ проверит существующие данные на новое ограничение.
С NOCHECK не будет проверять существующие данные против нового ограничения. Это позволит вам иметь дочерние записи без соответствующего родителя.

EDIT: Что касается того, почему SSMS делает это, я понятия не имею

Ответ 3

Оба являются серверами SQL Server 2005? В результате одно и то же, инструмент генерации кода может использовать разные подпрограммы, основанные на разных версиях продукта