Включить внешний ключ с проверкой существующих данных - PullRequest
7 голосов
/ 23 августа 2011

Мне нравятся внешние ключи, но я сталкиваюсь с одной проблемой с ними.У меня есть программа преобразования, где я отключаю внешние ключи для таблиц.Причина, по которой я это делаю, заключается в том, что я могу преобразовать все записи в основной таблице, но оставить другие таблицы зависимыми от этой таблицы без изменений, не восстанавливая их каждый раз, потому что они ОГРОМНЫ.

I 'Используя эти команды для отключения и повторного включения внешних ключей:

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

ALTER TABLE MyTable CHECK CONSTRAINT MyConstraint

Однако после повторного включения ограничения «Проверка существующих данных при создании или повторном включении» по-прежнему устанавливается на № IЯ понимаю, что для него установлено значение Нет, потому что я отключил ограничение, но, сделав это, он изменил мою схему базы данных, что мне не нравится.Я думал, что это будет рассматриваться как повторное включение ограничения и будет проверять существующие данные, но, очевидно, нет.

Нет ли способа изменить это с помощью команды ALTER TABLE?Я знаю, что могу, если я откажусь от ограничения и создам его заново, но я не собираюсь писать сценарий для воссоздания каждого имеющегося у меня внешнего ключа и его сохранения.

Я использую SQL Server 2008 R2.

1 Ответ

12 голосов
/ 23 августа 2011

Чтобы повторно включить ограничение:

 -- Enable the constraint
 ALTER TABLE MyTable 
 WITH CHECK CHECK CONSTRAINT MyConstraint
 GO

Примечание : необходимо дважды указать CHECK, чтобы принудительно проверить, что все значения внешнего ключа действительны.

Ограничения FOREIGN KEY и CHECK, которые отключены, помечены как is_not_trusted. Они доступны для просмотра в каталогах sys.check_constraints и sys.foreign_keys.Это означает, что ограничение больше не проверяется системой для всех строк таблицы.Даже если вы повторно включите ограничение, оно не будет повторно проверять существующие строки в таблице, если вы не укажете опцию WITH CHECK в ALTER TABLE.Указание WITH CHECK снова помечает ограничение как доверенное.

Ссылка: Рекомендации по отключению индексов и ограничений

Как отмечено в комментариях (для поисковых систем),это соответствует

sys.foreign_keys.is_not_trusted

в представлении каталога

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