Transaction SQL Server imbriquée effectuant une suppression en cascade
-
09-06-2019 - |
Question
Supposons que j'ai une table appelée Entreprises qui comporte une colonne DepartmentID.Il existe également une table Departments qui a comme colonne EmployeeID.Bien sûr, j'ai aussi une table Employee.Le problème est que je souhaite supprimer une entreprise, je dois donc d'abord supprimer tous les employés de chaque département, puis tous les départements de l'entreprise.Cascade Supprimer n'est pas une option, je souhaite donc utiliser des transactions imbriquées.Je suis nouveau sur SQL, j'apprécierais donc votre aide.
La solution
Je ne sais pas pourquoi vous avez besoin de transactions imbriquées ici.Vous n’avez besoin que d’une seule transaction réelle :
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
Notez le double FROM, ce n'est pas une faute de frappe, c'est la syntaxe SQL correcte pour effectuer un JOIN dans un DELETE.
Chaque instruction est atomique, soit l'intégralité du DELETE réussira, soit échouera, ce qui n'est pas si important dans ce cas car l'ensemble du lot réussira ou échouera.
BTW- Je pense que vous aviez vos relations à l’envers.Le département n'aurait pas d'ID d'employé, l'employé aurait un ID de département.
Autres conseils
Je ne réponds pas à ta question, mais aux Clés étrangères est la voie à suivre, pourquoi n'est-ce pas une option ?
Quant aux transactions imbriquées, ce sont :
BEGIN
delete from Employee where departmentId = 1;
BEGIN
delete from Department where companyId = 2;
BEGIN
delete from Company where companyId = 2;
END
END
END
D'un point de vue programmatique, cela semble différent bien sûr, mais cela dépend de la plate-forme que vous utilisez