Jeśli znajdziesz się w sytuacji, w której musisz wyłączyć ograniczenie klucza obcego w SQL Server, oto jak to zrobić za pomocą Transact-SQL.
Umożliwi to wprowadzanie danych bez ograniczeń związanych z kluczem obcym. Oczywiście nie zrobiłbyś tego, gdyby nie miał bardzo dobrego powodu, aby to zrobić. Klucze obce wymuszają integralność referencyjną, więc ich wyłączenie może powodować różnego rodzaju problemy.
Przykład 1 – Wyłącz ograniczenie klucza obcego
Aby wyłączyć ograniczenie klucza obcego, użyj NOCHECK
argument w ALTER TABLE
oświadczenie.
Tak:
ALTER TABLE BandMember NOCHECK CONSTRAINT FK_BandMember_Musician;
Ten kod wyłącza ograniczenie klucza obcego o nazwie FK_BandMember_Musician .
Przykład 2 – Przejrzyj ograniczenie
Możemy zapytać o sys.foreign_keys
widok systemu, aby sprawdzić, czy nasze ograniczenie zostało wyłączone:
SELECT name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys;
Wynik:
+--------------------------------+---------------+------------------+ | Constraint | is_disabled | is_not_trusted | |--------------------------------+---------------+------------------| | FK_BandMember_Band | 0 | 0 | | FK_BandMember_Musician | 1 | 1 | | FK_MembershipPeriod_BandMember | 0 | 0 | +--------------------------------+---------------+------------------+
W tym przypadku wybrałem wszystkie ograniczenia klucza obcego z bieżącej bazy danych.
Widzimy, że jest to jedyny wyłączony (ponieważ jego is_disabled kolumna jest ustawiona na 1 ).
Możesz zauważyć, że jest_nie_zaufany kolumna jest również ustawiona na 1 . Oznacza to, że ograniczenie nie zostało zweryfikowane przez system.
Ma to sens, ponieważ nie możemy już zakładać, że ograniczenie sprawdziło wszystkie dane. Fakt, że ograniczenie jest wyłączone, oznacza, że dane są teraz w stanie dostać się do bazy danych bez sprawdzania przez ograniczenie. Dlatego istnieje możliwość, że w bazie danych znajdą się nieprawidłowe dane.
Jeśli kiedykolwiek będziesz musiał ponownie włączyć ograniczenie, będziesz mieć możliwość przywrócenia zaufania ograniczenia (poprzez użycie WITH CHECK
opcja). Spowoduje to sprawdzenie wszystkich istniejących wierszy przed włączeniem ograniczenia.
Będziesz mieć również możliwość nie sprawdzanie istniejących danych, ale należy to robić tylko w rzadkich przypadkach.
Oto ponownie to samo zapytanie, ale z kilkoma dodatkowymi kolumnami pokazującymi tabele i tabele, do których istnieją odwołania:
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;
Wynik:
+--------------------------------+------------------+---------------------+---------------+------------------+ | 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 | +--------------------------------+------------------+---------------------+---------------+------------------+