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

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

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. W SQL Server, jak mogę zablokować pojedynczy wiersz w sposób podobny do Oracle SELECT FOR UPDATE WAIT?

  2. Jak utworzyć zapytanie przestawne na serwerze sql bez funkcji agregującej

  3. SQL - Jak przechowywać i nawigować w hierarchiach?

  4. SQL Server 2008 Spatial:znajdź punkt w wielokącie

  5. Co to jest operator logiczny AND w SQL Server — samouczek SQL Server / TSQL — część 120