I vincoli di integrità referenziale di propagazione consentono di definire le operazioni eseguite da SQL Server quando un utente tenta di eliminare o aggiornare una chiave alla quale fa riferimento una chiave esterna.
NO ACTION è il valore predefinito se non viene specificata ON DELETE o ON UPDATE.
- ON DELETE NO ACTION
Specifica che se si tenta di eliminare una riga contenente una chiave a cui fanno riferimento chiavi esterne in righe esistenti in altre tabelle, verrà generato un errore e verrà eseguito il rollback dell'istruzione DELETE.
- ON UPDATE NO ACTION
Specifica che se si tenta di aggiornare un valore di chiave in una riga e alla chiave fanno riferimento chiavi esterne in righe esistenti in altre tabelle, verrà generato un errore e verrà eseguito il rollback dell'istruzione UPDATE.
Con CASCADE, SET NULL e SET DEFAULT, le eliminazioni o gli aggiornamenti di valori di chiave possono influire sulle tabelle con relazioni di chiave esterna tracciabili alla tabella in cui è stata eseguita la modifica. Se le operazioni referenziali di propagazione sono state definite anche nelle tabelle di destinazione, tali operazioni saranno inoltre valide per le righe eliminate o aggiornate. Non è possibile specificare la clausola CASCADE per le chiavi esterne o primarie che includono una colonna timestamp.
- ON DELETE CASCADE
Specifica che se si tenta di eliminare una riga contenente una chiave a cui fanno riferimento chiavi esterne in righe esistenti in altre tabelle, verranno inoltre eliminate tutte le righe contenenti tali chiavi esterne.
- ON UPDATE CASCADE
Specifica che se si tenta di aggiornare un valore di chiave in una riga e a tale valore fanno riferimento chiavi esterne in righe esistenti in altre tabelle, tutti i valori che compongono la chiave esterna verranno anch'essi aggiornati al nuovo valore specificato per la chiave.
Non è possibile specificare la clausola CASCADE se nella chiave esterna o nella chiave a cui si fa riferimento è presente una colonna timestamp.
- ON DELETE SET NULL
Specifica che se si tenta di eliminare una riga contenente una chiave a cui fanno riferimento chiavi esterne in righe esistenti in altre tabelle, tutti i valori che compongono la chiave esterna presenti nelle righe a cui si fa riferimento verranno impostati su NULL. Per l'esecuzione di questo vincolo è necessario che le colonne chiave esterna ammettano i valori Null.
- ON UPDATE SET NULL
Specifica che se si tenta di aggiornare una riga contenente una chiave a cui fanno riferimento chiavi esterne in righe esistenti in altre tabelle, tutti i valori che compongono la chiave esterna presenti nelle righe a cui si fa riferimento verranno impostati su NULL. Per l'esecuzione di questo vincolo è necessario che le colonne chiave esterna ammettano i valori Null.
- ON DELETE SET DEFAULT
Specifica che se si tenta di eliminare una riga contenente una chiave a cui fanno riferimento chiavi esterne in righe esistenti in altre tabelle, tutti i valori che compongono la chiave esterna presenti nelle righe a cui si fa riferimento verranno impostati sul relativo valore predefinito. Per l'esecuzione di questo vincolo è necessario che per tutte le colonne chiave esterna della tabella di destinazione sia disponibile una definizione predefinita. Se una colonna ammette valori Null e non viene impostato un valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna. Per mantenere la validità del vincolo di chiave esterna, è necessario che per i valori non Null impostati da ON DELETE SET DEFAULT esistano valori corrispondenti nella tabella primaria.
- ON UPDATE SET DEFAULT
Specifica che se si tenta di aggiornare una riga contenente una chiave a cui fanno riferimento chiavi esterne in righe esistenti in altre tabelle, tutti i valori che compongono la chiave esterna presenti nelle righe a cui si fa riferimento verranno impostati sul relativo valore predefinito. Per l'esecuzione di questo vincolo è necessario che per tutte le colonne chiave esterna della tabella di destinazione sia disponibile una definizione predefinita. Se una colonna ammette valori Null e non viene impostato un valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna. Per mantenere la validità del vincolo di chiave esterna, è necessario che per i valori non Null impostati da ON UPDATE SET DEFAULT esistano valori corrispondenti nella tabella primaria.
Si consideri il vincolo FK_ProductVendor_Vendor_VendorID sulla tabella Purchasing.ProductVendor di AdventureWorks2008R2. Questo vincolo stabilisce una relazione di chiave esterna tra la colonna VendorID della tabella ProductVendor e la colonna chiave primariaVendorID della tabella Purchasing.Vendor. Se per il vincolo si specifica ON DELETE CASCADE e si elimina la riga in Vendor dove VendorID è uguale a 100, verranno inoltre eliminate le tre righe in ProductVendor dove VendorID è uguale a 100. Se per il vincolo si specifica ON UPDATE CASCADE e si aggiorna il valore VendorID nella tabella Vendor modificandolo da 100 a 155, verranno inoltre aggiornati i valori VendorID nelle tre righe di ProductVendor dove i valori correnti di VendorID sono uguali a 100.
Non è possibile specificare ON DELETE CASCADE per una tabella in cui è presente un trigger INSTEAD OF DELETE. Per queste tabelle non è possibile specificare ON DELETE SET NULL, ON DELETE SET DEFAULT, ON UPDATE CASCADE, ON UPDATE SET NULL e ON UPDATE SET DEFAULT.