SQL Server Check / NoCheck разница в сгенерированных скриптах - PullRequest
23 голосов
/ 27 августа 2009

Я пытаюсь синхронизировать схемы между различными базами данных. По сути, я выполнил задачи-> Создать сценарии с помощью SQL Server Management Studio (2005) для обеих баз данных и сравнил вывод с помощью инструмента сравнения.

По какой-то причине один сценарий добавляет ограничение WITH CHECK и один WITH NO CHECK , после чего оба ограничения повторно включаются.

Я за первую базу данных получаю:

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

Итак, у меня два вопроса:

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

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

Ответы [ 3 ]

18 голосов
/ 27 августа 2009

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

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

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

Чтобы узнать больше об этом, проверьте мой другой ответ , относящийся к параметрам FK & NO CHECK / CHECK.

17 голосов
/ 27 августа 2009

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

WITH CHECK проверит существующие данные на соответствие новому ограничению.
WITH NOCHECK не будет проверять существующие данные на соответствие новому ограничению. Это позволит вам иметь дочерние записи без соответствующего родителя.

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

0 голосов
/ 27 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...