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

Cascata su Elimina o usa i trigger?

ELIMINA A CASCATA in MSSQL Server può essere eseguito in cascata solo su una singola tabella. Se sono presenti due tabelle con relazioni di chiave esterna con una tabella delle dimensioni, è possibile eseguire l'eliminazione a catena solo su una di esse. (Questo per evitare che le eliminazioni si riversino a cascata attraverso più percorsi e creino conflitti, proprio come C++ consente l'ereditarietà multipla ma C# consente solo l'ereditarietà singola)

In questo caso, sei costretto a utilizzare i trigger o a gestire specificamente il caso nel tuo codice.

Per questo motivo ho visto molte persone optare per l'utilizzo di trigger in tutti i casi. Anche quando c'è solo una tabella straniera. Ciò garantisce coerenza e quindi le persone sanno cosa cercare durante la manutenzione del database.

Se si potesse sovrapporre un'eliminazione a più di una tabella, direi che sarebbe l'opzione più preferibile. Questa limitazione, tuttavia, confonde le acque e attualmente sono più favorevole ai fattori scatenanti che possiedono tutti questi comportamenti. Il sovraccarico nell'utilizzo di trigger per eliminazioni e aggiornamenti in cascata è solo minore in termini di codifica, ma consente pratiche standard che sono veramente generiche.

MODIFICA:

Potresti voler spostare la "risposta accettata" su qualcun altro, ho capito che mi sbagliavo su quanto sopra.

È POSSIBILE avere più tabelle dei fatti che hanno ON DELETE CASCADE Contratti di chiave esterna in una tabella di dimensioni signle.

Quello che non puoi fare è che una tabella dei fatti abbia ON DELETE CASCADE Vincoli di chiave esterna a più tabelle di dimensioni.

Quindi, ad esempio...
- Tabella dimensionale [Persona] (id INT IDENTITY, )
- Tabella dimensionale [Esame] (id INT IDENTITY, )
- Face Table [Punteggio_esame] (id_persona INT, exam_id INT, punteggio INT)

Se la Persona o l'Esame vengono eliminati, vorresti che anche i record Exam_Score associati vengano eliminati.

Ciò non è possibile utilizzando ON DELETE CASCADE in MS SQL Server, quindi la necessità di trigger.

(Mi scuso con Mehrdad che ha cercato di spiegarmelo, ma ho completamente perso il suo punto.)