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? В результате одно и то же, инструмент генерации кода может использовать разные подпрограммы, основанные на разных версиях продукта