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

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

Puoi usare il codice qui sotto per disabilitare tutti i CHECK e vincoli di chiave esterna per una tabella specifica in SQL Server.

Sostituisci semplicemente TableName con il nome della tabella applicabile.

ALTER TABLE TableName NOCHECK CONSTRAINT ALL

Di seguito è riportato un esempio in cui lo faccio e poi controllo il risultato.

Esempio 1:rivedere i vincoli

Per prima cosa, darò una rapida occhiata all'attuale CHECK e vincoli di chiave esterna nel database, per vedere se sono abilitati o 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        | 0             | 0                |
| ConstraintTest | chkValidEndDate | 0             | 0                |
| ConstraintTest | chkTeamSize     | 0             | 0                |
| 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 sono abilitati perché is_disabled è impostato su 0 .

Esempio 2:disabilitare i vincoli

Ora disabiliterò tutti i vincoli per il ConstraintTest tabella:

ALTER TABLE ConstraintTest 
NOCHECK CONSTRAINT ALL;

Esempio 3:verifica del risultato

Ora eseguo 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        | 1             | 1                |
| ConstraintTest | chkValidEndDate | 1             | 1                |
| ConstraintTest | chkTeamSize     | 1             | 1                |
| Occupation     | chkJobTitle     | 0             | 0                |
+----------------+-----------------+---------------+------------------+

Come previsto, tutti e tre i vincoli per ConstraintTest sono state disabilitate (perché is_disabled la colonna è impostata su 1 per quei vincoli).

Nota che il non_è attendibile anche la colonna è impostata su 1 . Questa è una considerazione importante, soprattutto se intendi riattivare uno dei tuoi vincoli disabilitati.

Per informazioni su come ripristinare l'attendibilità durante la riattivazione dei vincoli, vedere cosa dovresti sapere con NOCHECK quando si abilita un vincolo CHECK in SQL ServerSQL Server. Le informazioni in tale articolo si applicano anche alle chiavi esterne.

Disabilita i vincoli singolarmente

Se non vuoi disabilitare tutti i vincoli nella tabella, puoi disabilitarli singolarmente. Vedere Come disabilitare un vincolo CHECK in SQL Server e Come disabilitare una chiave esterna in SQL Server.

Riattiva i vincoli

Se è necessario riattivare tutti i vincoli per una tabella, vedere Come abilitare ALL CHECK e i vincoli di chiave esterna per una tabella.

Se è necessario riattivarli singolarmente, vedere Come abilitare un vincolo CHECK in SQL Server e Come abilitare una chiave esterna in SQL Server.