Saturday, March 22, 2014

Vincoli di integrità referenziale di propagazione #SQLServer

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.
Le clausole REFERENCES delle istruzioni CREATE TABLE e ALTER TABLE supportano le clausole ON DELETE e ON UPDATE. Le operazioni di propagazione possono anche essere definite utilizzando la finestra di dialogo Relazioni chiavi esterne:
  • [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
  • [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
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.

No comments:

Post a Comment