Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak włączyć wszystkie ograniczenia wyboru i klucza obcego dla tabeli w SQL Server (przykłady T-SQL)

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 i WITH NOCHECK dla innych).

Zobacz Jak włączyć ograniczenie CHECK w SQL Server i Jak włączyć klucz obcy w SQL Server.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Usuń konto pocztowe bazy danych (SSMS)

  2. Czy mierzysz wydajność programu SQL Server za pomocą tych wskaźników?

  3. Wstaw wyniki procedury składowanej do tabeli tymczasowej

  4. Zwróć podstawowy typ danych z wartości wariantu SQL_w SQL Server

  5. Data i godzina rzutowania SQL