Digamos que tengo 3 mesas en una jerarquía:VEZ de disparadores y Cascade caminos
TableA -> TableB -> TableC
TableC
tiene una relación de clave externa con TableB
y TableB
tiene una relación de clave externa con TableA
.
Si elimino un registro en TableA
, debería eliminar en cascada hacia abajo a través de la jerarquía. Usar ON DELETE CASCADE
funcionaría bien.
Sin embargo digamos que necesito poner un disparador INSTEAD OF
en TableC
. Según entiendo, un activador INSTEAD OF
no se puede colocar en una tabla que tenga una cascada de eliminación. Tomado de MSDN:
Para los desencadenadores INSTEAD OF, la opción DELETE no está permitida en las tablas que tienen una relación referencial que especifica una acción en cascada ON DELETE.
Si tengo que tomar la eliminación en cascada TableB->TableC
fuera, que tendría que utilizar un disparador INSTEAD OF
para hacer cumplir la integridad referencial, y luego tengo el mismo problema con TableB->TableA
. Este es un ejemplo simple, pero imagine que el camino de la cascada es mucho más grande. Parece que podría bola de nieve fácilmente a lo largo de una larga trayectoria en cascada.
¿Cuáles son las mejores prácticas para hacer frente a este escenario?
¿Qué desea que haga el desencadenador (en lugar de eliminar) que no rompería la integridad referencial? –
Quiero evitar añadir más complicaciones al ejemplo, ya que no estoy buscando soluciones de rediseño de tablas, sino más bien una respuesta al escenario específico. Sin embargo, para referencia, TableC usa el modelo de lista de adyacencia para almacenar una jerarquía. Estoy usando el desencadenador INSTEAD OF para eliminar de forma recursiva a través de la jerarquía. HierarchyID no es posible debido al uso de SS2005. –
Sin rediseñar la tabla, quizás esto pueda ayudar: [Servidor SQL: borrar con LLAVE EXTRANJERA autorreferencial] (http://explainextended.com/2010/03/03/sql-server-deleting-with-self-referential- foreign-key /) –