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

Come disabilitare tutti i vincoli CHECK e chiave esterna in un database in SQL Server (esempi T-SQL)

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

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Questo utilizza sp_MSforeachtable non documentato di Microsoft procedura memorizzata. Questa procedura consente di eseguire attività su ciascuna tabella in un database. Quindi è perfetto per il nostro compito qui:disabilitare tutti i CHECK vincoli all'interno del database corrente.

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, per due tabelle diverse.

Possiamo vedere che tutti i vincoli sono abilitati perché is_disabled è impostato su 0 .

Esempio 2:disabilitare i vincoli

Ora disabiliterò tutti i vincoli:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Di solito è una buona idea assicurarsi di utilizzare il database corretto quando si eseguono cose del genere. Quindi potremmo aggiungere al codice precedente passando esplicitamente al database corretto:

USE Test;
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

In questo caso passo a un database chiamato Test .

Esempio 3:verifica del risultato

Dopo aver eseguito il codice sopra, ora eseguirò 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     | 1             | 1                |
+----------------+-----------------+---------------+------------------+

Quindi tutti i vincoli nel database sono stati disabilitati (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 vuoi disabilitare i vincoli uno per uno, vedi Come disabilitare un vincolo CHECK in SQL Server per esempi.