Supposons que j'ai une table appelée Companies qui a une colonne DepartmentID. Il y a aussi une table Departaments qui a comme colonne EmployeeID. Bien sûr, j'ai aussi une table des employés. Le problème est que je veux supprimer une entreprise, donc d'abord je dois supprimer tous les employés pour chaque département et ensuite tous les départements de l'entreprise. Cascade Delete n'est pas une option, par conséquent je souhaite utiliser des transactions imbriquées. Je suis nouveau à SQL donc j'apprécierais votre aide.Transaction SQL Server imbriquée en cascade delete
Répondre
Je ne sais pas pourquoi vous avez besoin des transactions imbriquées ici. Vous avez seulement besoin d'une 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 à partir, ce n'est pas une faute de frappe, il est la syntaxe SQL correcte pour effectuer une JOIN dans un SUPPR.
Chaque instruction est atomique, soit l'intégralité de DELETE réussira ou échouera, ce qui n'est pas si important dans ce cas car le lot entier réussira ou échouera.
BTW- Je pense que vous aviez vos relations à rebours. Le ministère n'aurait pas d'ID employé, l'employé aurait un ID ministériel.
Je ne réponds pas à votre question, mais les clés étrangères est le chemin à parcourir, pourquoi n'est-ce pas une option?
En ce qui concerne les transactions imbriquées, ils 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
Programmatically il semble différent bien sûr, mais qui aurait dépendent de la plate-forme que vous utilisez
Vos requêtes peuvent être optimisées pour supprimer les INNER JOINs sur la société. Ou serait-ce quelque chose que SQL Server ferait automatiquement? – rpetrich
Vous avez raison. Je viens de les ajouter pour être explicite, mais vous pouvez modifier votre clause WHERE à: OERE Department.CompanyID = @CompanyID – Brannon