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.