Możesz użyć poniższego kodu, aby włączyć wszystkie CHECK
i ograniczenia klucza obcego dla bieżącej bazy danych w SQL Server.
Po włączeniu opcji CHECK
lub ograniczenie klucza obcego, masz możliwość sprawdzenia istniejących danych w tabeli przed włączeniem ograniczenia. W ten sposób można zweryfikować, czy którykolwiek z istniejących narusza to ograniczenie. Aby wykonać to sprawdzenie, użyj WITH CHECK
w kodzie, w przeciwnym razie użyj WITH NOCHECK
.
Przykładowy kod
Oto jak włączyć wszystkie CHECK
oraz ograniczenia klucza obcego w bazie danych. Pierwszy przykład sprawdza istniejące dane, drugi nie.
Z czekiem (zalecane):
EXEC sp_MSforeachtable "ZMIEŃ TABELĘ? Z SPRAWDŹ SPRAWDŹ OGRANICZENIE WSZYSTKICH"
Bez czeku:
EXEC sp_MSforeachtable "ZMIEŃ TABELĘ? Z NOCHECK CHECK CONSTRAINT ALL"
Możesz również jawnie podać nazwę argumentu (@command1
), jeśli wolisz (w obu przypadkach uzyskasz ten sam wynik).
Z czekiem:
EXEC sp_MSforeachtable @command1="ZMIEŃ TABELĘ? Z CHECK CHECK CONSTRAINT WSZYSTKO"
Bez czeku:
EXEC sp_MSforeachtable @command1="ZMIEŃ TABELĘ? Z CHECK CHECK CONSTRAINT WSZYSTKO"
Te przykłady używają (nieudokumentowanego) sp_MSforeachtable
procedura składowana. Ta procedura umożliwia wykonywanie zadań względem każdej tabeli w bazie danych. Więc jest to idealne rozwiązanie dla naszego zadania tutaj – aby włączyć wszystkie CHECK
i ograniczenia klucza obcego w bieżącej bazie danych.
Poniżej znajduje się przykład, w którym to robię, a następnie sprawdzam wynik.
Przykład 1 – Przejrzyj ograniczenia
Najpierw rzucę okiem na bieżące CHECK
i ograniczenia klucza obcego 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 | 1 | 1 |+----------------+-----------------+------------ ---+------------------+Tak więc obecnie są cztery
CHECK
ograniczenia ograniczenia w bazie danych, dla dwóch różnych tabel.Widzimy, że wszystkie ograniczenia są wyłączone, ponieważ jest_wyłączone jest ustawiony na 1 .
Ponadto wszystkie są niezaufane, ponieważ jest_nie_zaufany jest również ustawiony na 1 .
Przykład 2 – Włącz ograniczenia za pomocą funkcji WITH CHECK
Teraz włączę wszystkie ograniczenia za pomocą
WITH CHECK
argument:EXEC sp_MSforeachtable "ZMIEŃ TABELĘ? Z SPRAWDŹ SPRAWDŹ OGRANICZENIE WSZYSTKICH"Zawsze dobrze jest upewnić się, że używasz właściwej bazy danych podczas robienia tego typu rzeczy. Możemy więc zmodyfikować kod, najpierw przełączając się na właściwą bazę danych:
USE Test;EXEC sp_MSforeachtable "ZMIEŃ TABELĘ? Z SPRAWDŹ SPRAWDŹ OGRANICZENIE WSZYSTKICH"W tym przypadku przełączam się na bazę danych o nazwie Test przed wykonaniem procedury składowanej.
Przykład 3 – Sprawdź wynik
Po uruchomieniu powyższego kodu, teraz uruchomię 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 |+----------------+-----------------+------------ ---+------------------+Tak więc wszystkie ograniczenia w bazie danych zostały teraz włączone (ponieważ jest_wyłączone kolumna jest ustawiona na 0 dla wszystkich ograniczeń).
Widzimy również, że jest_nie_zaufany kolumna jest również ustawiona na 0 . Oznacza to, że ograniczenie jest zaufane. Jest zaufany, ponieważ sprawdziliśmy wszystkie istniejące dane przed włączeniem.
Gdybym użył
WITH NOCHECK
, ograniczenia pozostaną niezaufane (tj. ich jest_nie_zaufany flaga byłaby ustawiona na 1 ). Dzieje się tak, ponieważ baza danych może potencjalnie zawierać dane, które naruszają jedno (lub więcej) ograniczeń (nieprawidłowe dane mogły zostać wprowadzone do bazy danych, gdy ograniczenia były wyłączone).W rzadkich przypadkach może być konieczne przechowywanie w bazie danych nieprawidłowych danych. W takich przypadkach ograniczenie będzie musiało pozostać niezaufane, ponieważ istniejące dane nie przejdą wstępnego sprawdzenia, a zatem ograniczenie nie będzie mogło zostać włączone, chyba że użyje opcji
WITH NOCHECK
.Zobacz, co powinieneś wiedzieć o funkcji NOCHECK podczas włączania ograniczenia CHECK w programie SQL Server, aby uzyskać szczegółowy przykład przełączania między zaufanym i niezaufanym podczas wyłączania i ponownego włączania ograniczenia.
Włącz ograniczenia indywidualnie
Jeśli chcesz włączyć ograniczenia tylko jeden po drugim, zobacz Jak włączyć ograniczenie CHECK w SQL Server i Jak włączyć klucz obcy w SQL Server.