En general estoy cuidado con las eliminaciones en cascada (y otras acciones automáticas que podrían soltar / daños de datos), ya sea a través de disparadores o ON <something> CASCADE
. Tales instalaciones son muy poderosas, pero también potencialmente peligrosas.
- Entonces, ¿eliminar en cascada es una opción correcta aquí?
Sin duda, haría lo que está buscando: eliminar registros relacionados cuando se elimina un registro principal, sin necesidad de implementar ninguna otra lógica para garantizar que los hijos se eliminen primero, por lo que su código será más conciso. Todas las acciones se envolverán en una transacción implícita, por lo que si algo bloquea al niño, se elimina toda la operación, se mantiene la integridad referencial con poco o ningún esfuerzo de codificación adicional.
Asegúrese de que su uso de eliminaciones en cascada y otras acciones "detrás de escena" estén bien documentadas para que los futuros mantenedores del sistema lo sepan.
- ¿Cuando no se debe usar el detele en cascada?
¡No debe usarse si eres paranoico como yo! Un punto clave a considerar son los otros desarrolladores que actualmente, o pueden en el futuro, trabajar en su código / base de datos (de ahí el comentario anterior sobre la documentación de cualquier comportamiento "oculto").
En mi experiencia, es bastante común que las personas sin experiencia utilicen DELETE
luego re INSERT
para actualizar filas, especialmente cuando lo que realmente quieren es una operación MERGE
/ UPSERT
(actualizar filas existentes y crear nuevas donde no exista una fila con una clave dada) y el DBMS no admite fusión / inserción (o desconocen su compatibilidad). Sin acciones en cascada, esto es perfectamente seguro (o generará un error cuando amenace la integridad de los datos), pero si alguien hace esto para filas en una tabla principal donde los FK de referencia tienenON DELETE CASCADE
establecer luego, los datos relacionados se eliminarán como resultado de la eliminación inicial y no se reemplazarán, por lo que los datos se pierden (aunque la eliminación y la inserción posterior se envuelven en transacciones explícitas, la cascada ocurre con la operación de eliminación). espere para ver si la transacción reemplaza las filas en la tabla principal en las declaraciones posteriores) y la cascada podría continuar a través de otras relaciones (por ejemplo: eliminar un supervisor superior, su equipo se elimina por cascada, los equipos de sus equipos se eliminan por cascada, todos los registros rastreados para todas esas personas se eliminan en cascada, ...). Sin la conexión en cascada habilitada, solo obtendría un error aquí en lugar de que los datos se pierdan silenciosamente.