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

Come disabilitare un vincolo di chiave esterna in SQL Server (esempi T-SQL)

Se ti trovi nella situazione in cui devi disabilitare un vincolo di chiave esterna in SQL Server, ecco come farlo utilizzando Transact-SQL.

Ciò ti consentirà di inserire i dati senza essere limitato dalla chiave esterna. Ovviamente, non lo faresti a meno che tu non abbia un'ottima ragione per farlo. Le chiavi esterne impongono l'integrità referenziale, quindi la loro disabilitazione può creare tutti i tipi di problemi.

Esempio 1:disabilitare il vincolo di chiave esterna

Per disabilitare un vincolo di chiave esterna, usa il NOCHECK argomento all'interno di un ALTER TABLE dichiarazione.

In questo modo:

ALTER TABLE BandMember 
NOCHECK CONSTRAINT FK_BandMember_Musician; 

Questo codice disabilita un vincolo di chiave esterna chiamato FK_BandMember_Musician .

Esempio 2:revisione del vincolo

Possiamo interrogare sys.foreign_keys vista di sistema per verificare che il nostro vincolo sia stato disabilitato:

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Risultato:

+--------------------------------+---------------+------------------+
| Constraint                     | is_disabled   | is_not_trusted   |
|--------------------------------+---------------+------------------|
| FK_BandMember_Band             | 0             | 0                |
| FK_BandMember_Musician         | 1             | 1                |
| FK_MembershipPeriod_BandMember | 0             | 0                |
+--------------------------------+---------------+------------------+

In questo caso ho selezionato tutti i vincoli di chiave esterna 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 vincolo non è stato verificato dal sistema.

Questo ha senso, perché 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 dovessi riattivare il vincolo, avrai l'opportunità di ripristinare l'attendibilità 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.

Ecco di nuovo la stessa query, ma con alcune colonne extra per mostrare le tabelle e le tabelle referenziate:

SELECT 
  name AS 'Constraint',
  OBJECT_NAME(parent_object_id) AS 'Table',
  OBJECT_NAME(referenced_object_id) AS 'Referenced Table',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Risultato:

+--------------------------------+------------------+---------------------+---------------+------------------+
| Constraint                     | Table            | Referenced Table    | is_disabled   | is_not_trusted   |
|--------------------------------+------------------+---------------------+---------------+------------------|
| FK_BandMember_Band             | BandMember       | Band                | 0             | 0                |
| FK_BandMember_Musician         | BandMember       | Musician            | 1             | 1                |
| FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember          | 0             | 0                |
+--------------------------------+------------------+---------------------+---------------+------------------+