Możesz użyć poniższego kodu, aby włączyć wszystkie CHECK
i ograniczenia klucza obcego dla określonej tabeli w SQL Server.
Po włączeniu ograniczenia w programie SQL Server należy zdecydować, czy ma ono sprawdzać istniejące dane, czy nie. Jest to ważna uwaga, jeśli tabela już zawiera dane, ponieważ te istniejące dane mogą potencjalnie naruszać reguły ograniczenia.
Przykładowe oświadczenia
Poniżej znajdują się dwie przykładowe instrukcje, które pokazują różnicę między sprawdzaniem istniejących danych a niesprawdzaniem ich po włączeniu ograniczeń.
Aby sprawdzić istniejące dane, użyj WITH CHECK
w swoim oświadczeniu podczas włączania ograniczeń, w przeciwnym razie użyj WITH NOCHECK
.
Z czekiem:
ZMIEŃ TABELĘ NazwaTabeli Z SPRAWDŹ SPRAWDŹ OGRANICZENIE WSZYSTKIE
Bez sprawdzenia:
ALTER TABLE NazwaTabeli Z NOCHECK SPRAWDŹ OGRANICZENIE WSZYSTKIE
Wystarczy zastąpić TableName
z nazwą odpowiedniej tabeli.
Poniżej znajduje się przykład, w którym to robię i sprawdzam wyniki.
Przykład 1 – Przejrzyj ograniczenia
Najpierw rzucę okiem na bieżące CHECK
ograniczenia w bazie danych, aby sprawdzić, czy są włączone lub wyłączone.
SELECT OBJECT_NAME(parent_object_id) AS 'Tabela', nazwa AS 'Ograniczenie', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM sys.check_constraints;Wynik:
+----------------+-----------------+---------------- ----+------------------+| Tabela | Ograniczenie | is_disabled | nie jest_zaufany ||----------------+-----------------+------------- ---+------------------|| Test Ograniczeń | chkCena | 1 | 1 || Test Ograniczeń | chkValidEndDate | 1 | 1 || Test Ograniczeń | chkTeamSize | 1 | 1 || Zawód | chkTytułZadania | 0 | 0 |+----------------+-----------------+------------ ---+------------------+Tak więc obecnie są cztery
CHECK
ograniczenia w bazie danych, z których trzy dotycząConstraintTest
tabela.Widzimy, że wszystkie ograniczenia dla tabeli są wyłączone, ponieważ jest_wyłączone jest ustawiony na 1 .
Widzimy również, że jest_nie_zaufany kolumna jest ustawiona na 1 dla tych ograniczeń. Oznacza to, że nie są ufani. Nie można im ufać, gdy są wyłączone, ponieważ nieprawidłowe dane mogą wejść do bazy danych bez sprawdzania. Więcej na ten temat poniżej.
Drugie ograniczenie (dla innej tabeli) jest już włączone i zaufane (ale możemy zignorować tę tabelę/ograniczenie w tym artykule).
Przykład 2 – Włącz ograniczenia za pomocą funkcji WITH CHECK
Teraz włączę wszystkie ograniczenia dla
ConstraintTest
tabela:ZMIEŃ TEST Ograniczeń TABELI ZA POMOCĄ KONTROLI SPRAWDŹ OGRANICZENIE WSZYSTKICH;To wszystko – gotowe.
Teraz uruchommy to samo zapytanie z pierwszego przykładu, aby zobaczyć wynik.
SELECT OBJECT_NAME(parent_object_id) AS 'Tabela', nazwa AS 'Ograniczenie', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM sys.check_constraints;Wynik:
+----------------+-----------------+---------------- ----+------------------+| Tabela | Ograniczenie | is_disabled | nie jest_zaufany ||----------------+-----------------+------------- ---+------------------|| Test Ograniczeń | chkCena | 0 | 0 || Test Ograniczeń | chkValidEndDate | 0 | 0 || Test Ograniczeń | chkTeamSize | 0 | 0 || Zawód | chkTytułZadania | 0 | 0 |+----------------+-----------------+------------ ---+------------------+Wszystkie trzy ograniczenia dla ConstraintTest tabela jest teraz włączona i zaufana.
Są zaufani, ponieważ użyłem
WITH CHECK
w moim oświadczeniu. Gdybym tego nie zrobił, otrzymałbym inny wynik, jak zobaczysz poniżej.Używając
WITH CHECK
, mogę być pewien, że wszelkie istniejące dane w tabeli są w rzeczywistości zgodne z ograniczeniami.Przykład 3 – Włącz ograniczenia za pomocą funkcji WITH NOCHECK
Teraz ponownie włączę ograniczenia za pomocą
WITH CHECK
więc możemy zobaczyć, jak to wpływa na wynik.Ale najpierw muszę je wyłączyć:
ALTER TABLE ConstraintTest NOCHECK CONSTRAINT ALL;Sprawdź, czy są wyłączone:
SELECT OBJECT_NAME(parent_object_id) AS 'Tabela', nazwa AS 'Ograniczenie', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM sys.check_constraints;Wynik:
+----------------+-----------------+---------------- ----+------------------+| Tabela | Ograniczenie | is_disabled | nie jest_zaufany ||----------------+-----------------+------------- ---+------------------|| Test Ograniczeń | chkCena | 1 | 1 || Test Ograniczeń | chkValidEndDate | 1 | 1 || Test Ograniczeń | chkTeamSize | 1 | 1 || Zawód | chkTytułZadania | 0 | 0 |+----------------+-----------------+------------ ---+------------------+Więc są ponownie wyłączone.
Teraz włącz je ponownie za pomocą
WITH NOCHECK
:ALTER TABLE ConstraintTest Z NOCHECK CHECK CONSTRAINT ALL;Sprawdź ponownie:
SELECT OBJECT_NAME(parent_object_id) AS 'Tabela', nazwa AS 'Ograniczenie', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM sys.check_constraints;Wynik:
+----------------+-----------------+---------------- ----+------------------+| Tabela | Ograniczenie | is_disabled | nie jest_zaufany ||----------------+-----------------+------------- ---+------------------|| Test Ograniczeń | chkCena | 0 | 1 || Test Ograniczeń | chkValidEndDate | 0 | 1 || Test Ograniczeń | chkTeamSize | 0 | 1 || Zawód | chkTytułZadania | 0 | 0 |+----------------+-----------------+------------ ---+------------------+Widzimy, że ograniczenia zostały pomyślnie włączone, ale tym razem pozostają niezaufane.
Ograniczenia są niezaufane, ponieważ nie sprawdzały żadnych istniejących danych przed włączeniem.
Tak więc kluczową kwestią jest to, że jeśli chcesz, aby Twoje ograniczenia były zaufane, upewnij się, że używasz
WITH CHECK
podczas ich włączania.Pojedyncze włączanie ograniczeń
Jeśli nie chcesz włączać wszystkich wiązań naraz, możesz włączyć je pojedynczo. Może to być również przydatne, jeśli musisz włączyć wszystkie ograniczenia, ale musisz użyć innych ustawień (np.
WITH CHECK
dla niektórych iWITH NOCHECK
dla innych).Zobacz Jak włączyć ograniczenie CHECK w SQL Server i Jak włączyć klucz obcy w SQL Server.