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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top