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

Come abilitare tutti i vincoli CHECK e chiave esterna per una tabella in SQL Server (esempi T-SQL)

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.