Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come disabilitare un vincolo CHECK in SQL Server (esempi T-SQL)

Quando tenti di inserire dati in una tabella che ha un CHECK completamente abilitato vincolo, avrai successo solo se i dati non violano tale vincolo. Se tenti di inserire dati non validi, l'operazione fallirà con un errore.

Ma cosa succede se ti trovi nella situazione in cui devi davvero devi inserire dati che violeranno il CHECK vincolo? Forse il vincolo non si applica più, o forse hai un'eccezione in cui una riga può ignorare il vincolo. In ogni caso, non potrai inserire nulla al di fuori delle regole del vincolo.

Se ti trovi in ​​questa situazione, puoi sempre disabilitare il vincolo. Ecco come farlo utilizzando Transact-SQL.

Esempio 1:disabilitare il vincolo CHECK

Per disabilitare un CHECK vincolo, usa il NOCHECK argomento all'interno di un ALTER TABLE dichiarazione.

In questo modo:

ALTER TABLE Occupation  
NOCHECK CONSTRAINT chkJobTitle; 

Questo codice disabilita un vincolo chiamato chkJobTitle .

Esempio 2:rivedere il vincolo CHECK

Possiamo interrogare il sys.check_constraints vista di sistema per verificare che il nostro vincolo sia stato disabilitato:

SELECT 
  name,
  is_disabled,
  is_not_trusted,
  definition
FROM sys.check_constraints;

Risultato:

+-----------------+---------------+------------------+----------------------------------------+
| name            | is_disabled   | is_not_trusted   | definition                             |
|-----------------+---------------+------------------+----------------------------------------|
| chkPrice        | 0             | 0                | ([Price]>(0))                          |
| chkValidEndDate | 0             | 0                | ([EndDate]>=[StartDate])               |
| chkTeamSize     | 0             | 0                | ([TeamSize]>=(5) AND [TeamSize]<=(20)) |
| chkJobTitle     | 1             | 1                | ([JobTitle]<>'Digital Nomad')          |
+-----------------+---------------+------------------+----------------------------------------+

In questo caso ho selezionato tutti i CHECK vincoli dal database corrente.

Possiamo vedere che questo è l'unico che è disabilitato (perché il suo is_disabled la colonna è impostata su 1 ).

Potresti notare che non è attendibile anche la colonna è impostata su 1 . Ciò indica che il CHECK il vincolo non è stato verificato dal sistema per tutte le righe.

In altre parole, non possiamo più presumere che il vincolo abbia verificato tutti i dati. Il fatto che il vincolo sia disabilitato significa che i dati sono ora in grado di entrare nel database senza essere controllati dal vincolo. Pertanto, esiste la possibilità che nel database siano presenti dati non validi.

Se hai bisogno di riattivare il CHECK vincolo, avrai l'opportunità di ripristinare la fiducia del vincolo (utilizzando il WITH CHECK opzione). Questo controllerà tutte le righe esistenti prima di abilitare il vincolo.

Avrai anche la possibilità di non controllare i dati esistenti, ma questo dovrebbe essere fatto solo in rari casi.

Vedi cosa dovresti sapere CON NOCHECK quando si abilita un vincolo CHECK in SQL Server per una dimostrazione di come viene influenzata la fiducia, a seconda di come si riattiva il vincolo.