Ако се окажете в ситуация, в която трябва да деактивирате ограничение за външен ключ в SQL Server, ето как да направите това с помощта на Transact-SQL.
Това ще ви позволи да въвеждате данни, без да бъдете ограничени от външния ключ. Очевидно не бихте направили това, освен ако нямате много добра причина да го направите. Външните ключове налагат референтната цялост, така че деактивирането им има потенциал да създаде всякакви проблеми.
Пример 1 – Деактивирайте ограничението за външния ключ
За да деактивирате ограничение на външния ключ, използвайте NOCHECK
аргумент в ALTER TABLE
изявление.
Като това:
ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician;
Този код деактивира ограничение на външния ключ, наречено FK_BandMember_Musician .
Пример 2 – Прегледайте ограничението
Можем да потърсим sys.foreign_keys
системен изглед, за да проверите дали нашето ограничение е деактивирано:
SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
Резултат:
+--------------------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |--------------------------------+---------------+------------------| | FK_BandMember_Band | 0 | 0 | | FK_BandMember_Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | 0 | 0 | +--------------------------------+---------------+------------------+
В този случай избрах всички ограничения на външния ключ от текущата база данни.
Можем да видим, че това е единственият, който е деактивиран (защото is_disabled колоната е настроена на 1 ).
Може да забележите, че is_not_trusted колоната също е настроена на 1 . Това показва, че ограничението не е проверено от системата.
Това има смисъл, защото вече не можем да приемем, че ограничението е проверило всички данни. Фактът, че ограничението е деактивирано, означава, че данните вече могат да влязат в базата данни, без да бъдат проверявани от ограничението. Следователно съществува потенциал за невалидни данни да присъстват в базата данни.
Ако някога се наложи да активирате отново ограничението, ще имате възможност да възстановите доверието на ограничението (като използвате WITH CHECK
опция). Това ще провери всички съществуващи редове, преди да активирате ограничението.
Ще имате и опцията не проверка на съществуващите данни, но това трябва да се прави само в редки случаи.
Ето отново същата заявка, но с някои допълнителни колони за показване на таблиците и референтните таблици:
SELECT name AS 'Constraint', OBJECT_NAME(parent_object_id) AS 'Table', OBJECT_NAME(referenced_object_id) AS 'Referenced Table', is_disabled, is_not_trusted FROM sys.foreign_keys;
Резултат:
+--------------------------------+------------------+---------------------+---------------+------------------+ | Constraint | Table | Referenced Table | is_disabled | is_not_trusted | |--------------------------------+------------------+---------------------+---------------+------------------| | FK_BandMember_Band | BandMember | Band | 0 | 0 | | FK_BandMember_Musician | BandMember | Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember | 0 | 0 | +--------------------------------+------------------+---------------------+---------------+------------------+