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

Jak włączyć ograniczenie wyboru w programie SQL Server (przykład T-SQL)

Jeśli masz CHECK ograniczenie w SQL Server, które jest obecnie wyłączone, możesz użyć poniższego kodu, aby je ponownie włączyć.

Po włączeniu opcji CHECK ograniczenie (lub ograniczenie klucza obcego w tym przypadku), masz możliwość określenia, czy sprawdzić istniejące dane w tabeli.

Poniżej znajdują się przykłady kodu umożliwiające CHECK ograniczenie, określając każdą z tych różnych opcji.

Przykład 1 – Włącz wiązanie za pomocą WITH CHECK

Jest to zalecana metoda włączania funkcji CHECK ograniczenia (chyba że masz konkretny powód, aby go nie używać).

Oto przykład włączenia ograniczenia o nazwie chkJobTitle :

ALTER TABLE Occupation  
WITH CHECK CHECK CONSTRAINT chkJobTitle;

Tutaj wyraźnie stwierdzam WITH CHECK , który informuje SQL Server, aby sprawdził istniejące dane przed włączeniem ograniczenia. Jeśli jakiekolwiek dane naruszają ograniczenie, ograniczenie nie zostanie włączone i pojawi się błąd.

To dobrze, ponieważ wymusza integralność danych.

Kiedy tworzysz nowy CHECK ograniczenie, jest to ustawienie domyślne. Jednak po włączeniu istniejącego ograniczenia (tak jak robimy to tutaj) nie ustawienie domyślne.

Przykład 2 – Włącz wiązanie za pomocą funkcji WITH NOCHECK

W tym przykładzie ograniczenie jest włączone bez sprawdzania istniejących danych:

ALTER TABLE Occupation  
WITH NOCHECK CHECK CONSTRAINT chkJobTitle;

Tutaj wyraźnie stwierdzam WITH NOCHECK , który informuje SQL Server, aby nie sprawdzał istniejących danych. Oznacza to, że ograniczenie zostanie włączone, nawet jeśli tabela zawiera już dane, które naruszają ograniczenie.

Jest to ustawienie domyślne podczas włączania ograniczenia (ale nie podczas jego tworzenia).

Jednym z niewielu powodów (prawdopodobnie jedynym powodem), dla którego warto to wykorzystać, jest chęć przechowywania nieprawidłowych danych w bazie danych. Być może masz jednorazowy wyjątek, w którym musisz wprowadzić wiersz lub więcej nieprawidłowych danych, ale wszystkie przyszłe dane muszą być zgodne z ograniczeniem.

Jednak nadal istnieje ryzyko związane z robieniem tego. Oto, co Microsoft ma do powiedzenia na ten temat:

Nie zalecamy tego, z wyjątkiem rzadkich przypadków. Nowe ograniczenie jest oceniane we wszystkich późniejszych aktualizacjach danych. Wszelkie naruszenia ograniczeń, które są pomijane przez WITH NOCHECK po dodaniu ograniczenia może spowodować niepowodzenie przyszłych aktualizacji, jeśli zaktualizują one wiersze z danymi, które nie są zgodne z ograniczeniem.

Więc używając WITH NOCHECK może potencjalnie powodować problemy w przyszłości.

Przykład 3 – Włącz ograniczenie za pomocą opcji domyślnej

Oto przykład z użyciem domyślnej opcji:

ALTER TABLE Occupation  
CHECK CONSTRAINT chkJobTitle;

Ten przykład jest odpowiednikiem poprzedniego przykładu. Ponieważ nie określiłem, czy sprawdzać, czy nie, SQL Server zakłada, że ​​chcę WITH NOCHECK .

Korzystanie z WITH NOCHECK usuwa zaufanie

Po włączeniu ograniczenia za pomocą WITH NOCHECK , jedną z konsekwencji, o której należy pamiętać, jest to, że SQL Server nie ufa już temu ograniczeniu. Oznacza to jako niezaufane.

Tak, dobrze to przeczytałeś. W rzeczywistości istnieje is_not_trusted flaga, którą SQL Server ustawia na 1 kiedy wyłączysz CHECK ograniczenie (co oznacza, że ​​nie jest zaufane) i jedyny sposób na ustawienie go na 0 (zaufane) jest określenie WITH CHECK po ponownym włączeniu ograniczenia. Używanie WITH NOCHECK po prostu go nie wycina.

To ma sens. W końcu czy ty? zaufać ograniczeniu, które nie sprawdziło wszystkich danych?

Używając WITH CHECK , upewnij się, że ograniczenie sprawdza wszystkie istniejące dane przed włączeniem. Jedynym sposobem, w jaki można to włączyć, jest zgodność wszystkich istniejących danych z ograniczeniem. Po sprawdzeniu wszystkich istniejących danych można mu zaufać.

Aby uzyskać więcej informacji na ten temat, zobacz Co powinieneś wiedzieć o funkcji NOCHECK podczas włączania ograniczenia CHECK w SQL Server, gdzie możesz zobaczyć rzeczywisty is_not_trusted flaga jest przełączana tam iz powrotem za każdym razem, gdy wyłączam i ponownie włączam CHECK ograniczenie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server - połącz wiersze w listę oddzieloną przecinkami

  2. Dowiedz się, czy obiekt jest kluczem obcym za pomocą OBJECTPROPERTY() w SQL Server

  3. Niepoprawna składnia w pobliżu ''

  4. Korzystanie z procedur składowanych SQL Server z Pythona (pyodbc)

  5. Instrukcja ALTER TABLE była w konflikcie z ograniczeniem FOREIGN KEY