Transacción anidada de SQL Server que realiza eliminación en cascada
-
09-06-2019 - |
Pregunta
Supongamos que tengo una tabla llamada Empresas que tiene una columna ID de departamento.También hay una tabla de Departamentos que tiene como columna EmployeeID.Por supuesto, también tengo una mesa de Empleados.El problema es que quiero eliminar una empresa, así que primero tengo que eliminar todos los empleados de cada departamento y luego todos los departamentos de la empresa.La eliminación en cascada no es una opción, por lo tanto, deseo utilizar transacciones anidadas.Soy nuevo en SQL así que agradecería su ayuda.
Solución
No estoy seguro de por qué necesita transacciones anidadas aquí.Sólo necesitas una transacción real:
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
Tenga en cuenta el doble FROM, que no es un error tipográfico, es la sintaxis SQL correcta para realizar un JOIN en un DELETE.
Cada declaración es atómica, el DELETE completo tendrá éxito o fallará, lo cual no es tan importante en este caso porque todo el lote tendrá éxito o fallará.
Por cierto, creo que tenías tus relaciones al revés.El Departamento no tendría un ID de Empleado, el Empleado tendría un ID de Departamento.
Otros consejos
No estoy respondiendo a tu pregunta, pero claves externas. es el camino a seguir, ¿por qué no es una opción?
En cuanto a las transacciones anidadas son:
BEGIN
delete from Employee where departmentId = 1;
BEGIN
delete from Department where companyId = 2;
BEGIN
delete from Company where companyId = 2;
END
END
END
Programáticamente se ve diferente, por supuesto, pero eso dependerá de la plataforma que estés usando.