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 | +--------------------------------+------------------+---------------------+---------------+------------------+