Transazione SQL Server annidata che esegue l'eliminazione a catena
-
09-06-2019 - |
Domanda
Supponiamo di avere una tabella denominata Companies con una colonna DepartmentID.C'è anche una tabella Departaments che ha come colonna EmployeeID.Ovviamente ho anche una tabella Employee.Il problema è che voglio eliminare un'azienda, quindi prima devo eliminare tutti i dipendenti di ogni dipartimento e poi tutti i dipartimenti dell'azienda.L'eliminazione a cascata non è un'opzione, quindi desidero utilizzare transazioni nidificate.Sono nuovo in SQL quindi apprezzerei il tuo aiuto.
Soluzione
Non sono sicuro del motivo per cui hai bisogno di transazioni nidificate qui.Hai solo bisogno di una transazione effettiva:
BEGIN TRAN
DELETE FROM Employee
FROM Employee
INNER JOIN Department ON Employee.DepartmentID = Department.DepartmentID
INNER JOIN Company ON Department.CompanyID = Company.CompanyID
WHERE Company.CompanyID = @CompanyID
DELETE FROM Department
FROM Department
INNER JOIN Company ON Department.CompanyID = Company.CompanyID
WHERE Company.CompanyID = @CompanyID
DELETE FROM Company
WHERE Company.CompanyID = @CompanyID
COMMIT TRAN
Nota il doppio FROM, non è un errore di battitura, è la sintassi SQL corretta per eseguire un JOIN in un DELETE.
Ogni istruzione è atomica, l'intero DELETE avrà esito positivo o negativo, il che non è così importante in questo caso perché l'intero batch avrà esito positivo o negativo.
A proposito, penso che tu abbia avuto le tue relazioni al contrario.Il Dipartimento non avrebbe un EmployeeID, il Dipendente avrebbe un DepartmentID.
Altri suggerimenti
Non sto rispondendo alla tua domanda, ma a chiavi straniere È la strada da percorrere, perché non è un'opzione?
Per quanto riguarda le transazioni nidificate sono:
BEGIN
delete from Employee where departmentId = 1;
BEGIN
delete from Department where companyId = 2;
BEGIN
delete from Company where companyId = 2;
END
END
END
Ovviamente a livello di programmazione sembra diverso, ma dipende dalla piattaforma che stai utilizzando