Поддерживается ли отключение и включение ограничений внешнего ключа в SQL Server? Или это единственный вариант для меня, drop
а затем повторноcreate
ограничения?
824
Поддерживается ли отключение и включение ограничений внешнего ключа в SQL Server? Или это единственный вариант для меня, drop
а затем повторноcreate
ограничения?
Ответы:
Если вы хотите отключить все ограничения в базе данных, просто запустите этот код:
Чтобы снова включить их, запустите: (печать, конечно, не является обязательной, и она просто перечисляет таблицы)
Я считаю это полезным при заполнении данных из одной базы данных в другую. Это гораздо лучший подход, чем снятие ограничений. Как вы упомянули, это удобно, когда вы удаляете все данные в базе данных и заново заполняете их (скажем, в тестовой среде).
Если вы удаляете все данные, вам может пригодиться это решение .
Также иногда бывает удобно отключить все триггеры, полное решение можно посмотреть здесь .
источник
"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Должен ли там быть только один «ПРОВЕРКА»?http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx
источник
Чтобы отключить ограничение, у вас есть
ALTER
таблица с использованием NOCHECKЧтобы позволить вам использовать двойную проверку :
После завершения, если вам нужно проверить статус, используйте этот сценарий, чтобы вывести список ограничений. Будет очень полезно:
источник
sys.sysforeignkeys
msdn.microsoft.com/en-us/library/ms177604.aspxНаилучшим вариантом является УДАЛЕНИЕ и СОЗДАНИЕ ограничений внешнего ключа.
В этом посте я не нашел примеров, которые бы работали для меня «как есть», один не будет работать, если внешние ключи ссылаются на разные схемы, другой не будет работать, если внешний ключ ссылается на несколько столбцов. Этот скрипт учитывает как несколько схем, так и несколько столбцов для каждого внешнего ключа.
Вот скрипт, который генерирует операторы «ADD CONSTRAINT», для нескольких столбцов он разделяет их запятыми ( обязательно сохраните эти выходные данные перед выполнением операторов DROP ):
Вот скрипт, который генерирует операторы "DROP CONSTRAINT":
источник
Стандарт SQL-92 позволяет объявлять консистент как DEFERRABLE, чтобы его можно было откладывать (неявно или явно) в рамках транзакции. К сожалению, SQL Server все еще не хватает этой функциональности SQL-92.
Для меня изменение ограничения на NOCHECK сродни изменению структуры базы данных на лету - такие ограничения, безусловно, есть - и чего-то следует избегать (например, пользователям требуются повышенные привилегии).
источник
Я согласен с тобой, Хэмлин. Когда вы передаете данные с использованием служб SSIS или когда хотите реплицировать данные, кажется весьма необходимым временно отключить или удалить ограничения внешнего ключа, а затем повторно включить или воссоздать их. В этих случаях ссылочная целостность не является проблемой, поскольку она уже поддерживается в исходной базе данных. Таким образом, вы можете быть уверены в этом вопросе.
источник
источник
WITH CHECK CHECK
почти наверняка требуется!Этот вопрос был поднят в некоторых ответах и комментариях, но я чувствую, что это достаточно важно, чтобы повторить это.
Повторное включение ограничения с помощью следующей команды (no
WITH CHECK
) будет иметь некоторые серьезные недостатки .Примечание: WITH NOCHECK является значением по умолчанию для повторного включения ограничений. Я должен задаться вопросом, почему ...
Sys.foreign_keys вид системы обеспечивает некоторую видимость в этот вопрос. Обратите внимание , что она имеет как
is_disabled
иis_not_trusted
столбец.is_disabled
указывает, будут ли будущие операции манипулирования данными проверяться на соответствие ограничению.is_not_trusted
указывает, были ли все данные в настоящее время в таблице проверены на соответствие ограничению.Ваши ограничения заслуживают доверия? Узнайте ...
источник
Первый пост :)
Для OP решение Кристофа будет работать, если только не возникнут проблемы с большими объемами данных и всплывающими подсказками журнала транзакций при больших удалениях. Кроме того, даже при сохранении хранилища tlog, поскольку удаляет запись в tlog, операция может занять ОЧЕНЬ много времени для таблиц с сотнями миллионов строк.
Я часто использую ряд курсоров для усечения и перезагрузки больших копий одной из наших огромных производственных баз данных. Разработанное решение учитывает несколько схем, несколько столбцов внешнего ключа и, что лучше всего, может быть выделено для использования в SSIS.
Он включает в себя создание трех промежуточных таблиц (реальных таблиц) для размещения сценариев DROP, CREATE и CHECK FK, создание и вставку этих сценариев в таблицы, а затем циклическое перемещение по таблицам и их выполнение. Прикрепленный сценарий состоит из четырех частей: 1.) создание и хранение сценариев в трех промежуточных (реальных) таблицах, 2.) выполнение сценариев удаления FK с помощью курсора одна за другой, 3.) использование sp_MSforeachtable для усечения всех таблиц в базе данных, отличных от наших трех промежуточных таблиц и 4.) выполнения команд create FK и проверки сценариев FK в конце пакета ETL SSIS.
Запустите часть создания сценария в задаче «Выполнение SQL» в службах SSIS. Запустите часть «Выполнить удаление сценариев FK» во второй задаче «Выполнение SQL». Поместите сценарий усечения в третью задачу «Выполнение SQL», затем выполните все другие процессы ETL, которые вам нужно выполнить, прежде чем присоединять сценарии CREATE и CHECK к окончательной задаче «Выполнение SQL» (или двум, если необходимо), в конце потока управления.
Хранение сценариев в реальных таблицах оказалось неоценимым, когда не удается повторно применить внешние ключи, так как вы можете выбрать * из sync_CreateFK, скопировать / вставить в окно запроса, запустить их по одному и исправить проблемы с данными, как только вы найти те, которые не удалось / все еще не удается повторно применить.
Не перезапускайте сценарий снова, если он завершится неудачей, не убедившись, что вы повторно применили все внешние ключи / проверки перед этим, иначе вы, скорее всего, потеряете некоторое создание и будете проверять скрипты fk, так как наши промежуточные таблицы удаляются и воссоздан до создания сценариев для выполнения.
источник
Найти ограничение
Выполнить SQL, сгенерированный этим SQL
Safeway.
Примечание. Добавлено решение для удаления ограничения, чтобы таблица могла быть удалена или изменена без каких-либо ошибок ограничения.
источник
Щелкните правой кнопкой мыши дизайн таблицы и перейдите к Отношениям и выберите внешний ключ на левой панели и на правой панели, установите для параметра Принудительное ограничение внешнего ключа значение «Да» (чтобы включить ограничения внешнего ключа) или «Нет» (чтобы отключи это).
источник
Ответ с пометкой «905» выглядит хорошо, но не работает.
Следующее сработало для меня. Любые ограничения первичного ключа, уникального ключа или значения по умолчанию НЕ МОГУТ быть отключены. Фактически, если 'sp_helpconstraint' 'показывает' n / a 'в status_enabled - это значит, что НЕ может быть включено / отключено.
- Сгенерировать скрипт для DISABLE
- Сгенерировать скрипт для ENABLE
источник
На самом деле вы должны иметь возможность отключить ограничения внешнего ключа так же, как вы временно отключаете другие ограничения:
Просто убедитесь, что вы отключаете ограничение для первой таблицы, указанной в имени ограничения. Например, если мое ограничение внешнего ключа было FK_LocationsEmployeesLocationIdEmployeeId, я хотел бы использовать следующее:
даже если нарушение этого ограничения приведет к ошибке, которая не обязательно будет указывать эту таблицу как источник конфликта.
источник
Один сценарий, чтобы управлять ими всеми: он объединяет команды усечения и удаления с sp_MSforeachtable, так что вы можете избежать отбрасывания и воссоздания ограничений - просто укажите таблицы, которые нужно удалять, а не усекать, и для моих целей я добавил дополнительный фильтр схемы для хорошего мера (проверено в 2008r2)
источник
Вы можете временно отключить ограничения на своих таблицах, выполнить работу, а затем восстановить их.
Вот простой способ сделать это ...
Отключите все индексы, включая первичные ключи, которые отключат все внешние ключи, затем снова включите только первичные ключи, чтобы вы могли работать с ними ...
[Сделайте что-нибудь, как загрузка данных]
Затем снова включите и восстановите индексы ...
источник
@sql
всегда обрезается. :(У меня есть более полезная версия, если вам интересно. Я поднял немного кода с сайта, на котором ссылка больше не активна. Я изменил его, чтобы разрешить массив таблиц в хранимой процедуре, и он заполняет операторы drop, truncate, add перед выполнением всех из них. Это дает вам возможность определять, какие таблицы нужно обрезать.
источник