Puoi utilizzare il codice qui sotto per abilitare tutti i CHECK
e vincoli di chiave esterna per una tabella specifica in SQL Server.
Quando si abilita un vincolo in SQL Server, è necessario decidere se controllare o meno i dati esistenti. Questa è una considerazione importante se la tabella contiene già dati, perché i dati esistenti potrebbero potenzialmente violare le regole del vincolo.
Dichiarazioni di esempio
Di seguito sono riportate due istruzioni di esempio che mostrano la differenza tra il controllo dei dati esistenti e il non verificarli quando si abilitano i vincoli.
Per controllare i dati esistenti, usa WITH CHECK
nella tua dichiarazione quando abiliti i vincoli, altrimenti usa WITH NOCHECK
.
Con Assegno:
ALTER TABLE TableName WITH CHECK CHECK CONSTRAINT ALL
Senza assegno:
ALTER TABLE TableName WITH NOCHECK CHECK CONSTRAINT ALL
Sostituisci semplicemente TableName
con il nome della tabella applicabile.
Di seguito è riportato un esempio in cui lo faccio e controllo i risultati.
Esempio 1:rivedere i vincoli
Per prima cosa, darò una rapida occhiata all'attuale CHECK
vincoli nel database, per vedere se sono abilitati o meno.
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
Risultato:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 1 | 1 | | ConstraintTest | chkValidEndDate | 1 | 1 | | ConstraintTest | chkTeamSize | 1 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Quindi ci sono attualmente quattro CHECK
vincoli nel database, tre dei quali sono per il ConstraintTest
tabella.
Possiamo vedere che tutti i vincoli per la tabella sono disabilitati perché is_disabled è impostato su 1 .
Possiamo anche vedere che è_non_fidato la colonna è impostata su 1 per questi vincoli. Ciò significa che non sono affidabili. Non possono essere considerati attendibili mentre sono disabilitati, perché i dati non validi possono entrare nel database senza essere controllati. Maggiori informazioni su questo di seguito.
L'altro vincolo (per un'altra tabella) è già abilitato e attendibile (ma possiamo ignorare quella tabella/vincolo in questo articolo).
Esempio 2:abilitare i vincoli utilizzando WITH CHECK
Ora abiliterò tutti i vincoli per il ConstraintTest
tabella:
ALTER TABLE ConstraintTest WITH CHECK CHECK CONSTRAINT ALL;
Ecco fatto.
Ora eseguiamo la stessa query del primo esempio per vedere il risultato.
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
Risultato:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 0 | 0 | | ConstraintTest | chkValidEndDate | 0 | 0 | | ConstraintTest | chkTeamSize | 0 | 0 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Tutti e tre i vincoli per ConstraintTest le tabelle sono ora abilitate e affidabili.
Sono affidabili perché ho usato WITH CHECK
nella mia dichiarazione. Se non l'avessi fatto, avrei ottenuto un risultato diverso, come vedrai di seguito.
Usando WITH CHECK
, posso essere certo che tutti i dati esistenti nella tabella sono effettivamente conformi ai vincoli.
Esempio 3:abilitare i vincoli utilizzando WITH NOCHECK
Ora riattiverò i vincoli usando WITH CHECK
così possiamo vedere come questo influisca sul risultato.
Ma prima dovrò disabilitarli:
ALTER TABLE ConstraintTest NOCHECK CONSTRAINT ALL;
Verifica che siano disabilitati:
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
Risultato:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 1 | 1 | | ConstraintTest | chkValidEndDate | 1 | 1 | | ConstraintTest | chkTeamSize | 1 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Quindi sono di nuovo disabilitati.
Ora riattivali usando WITH NOCHECK
:
ALTER TABLE ConstraintTest WITH NOCHECK CHECK CONSTRAINT ALL;
Ricontrolla:
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
Risultato:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 0 | 1 | | ConstraintTest | chkValidEndDate | 0 | 1 | | ConstraintTest | chkTeamSize | 0 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Possiamo vedere che i vincoli sono stati abilitati con successo, ma questa volta rimangono non attendibili.
I vincoli non sono attendibili perché non hanno verificato alcun dato esistente prima di essere abilitati.
Quindi il punto chiave qui è, se vuoi che i tuoi vincoli siano affidabili, assicurati di utilizzare WITH CHECK
quando li abiliti.
Abilitazione dei vincoli singolarmente
Se non vuoi abilitare tutti i vincoli contemporaneamente, puoi abilitarli individualmente. Questo può essere utile anche se devi abilitare tutti i vincoli, ma devi utilizzare impostazioni diverse (ad es. WITH CHECK
per alcuni e WITH NOCHECK
per gli altri).
Vedere Come abilitare un vincolo CHECK in SQL Server e Come abilitare una chiave esterna in SQL Server.