Pregunta

Tenemos una base de datos que por lo general tiene esta estructura:

Master Record Table
id (pk)
MasterRecordId <-- constrained to be unique

Los niños / hermanos (segunda generación, si se quiere):

Table1
(  table1ID (pk),
  MasterRecordID (fk))

Table2
(  Table2ID(pk),
  MasterRecordID (fk))

nietos (tercera generación):

Table3
( Table3ID (pk)
 Table1ID (fk))

Table4
 (Table4ID (pk)
  Table1ID (fk))

Table5
 (Table5ID (pk)
  Table2ID (fk))

No todas las mesas en la segunda generación tiene hijos. No se limita eliminar la funcionalidad de la aplicación (puede eliminar cualquier registro individual, pero FKs va a evitar la eliminación en muchos casos, la funcionalidad de eliminación es borked y no falla con gracia para ser franco).

Me han encargado de investigar la mejor manera de manejar su eliminación. Para la purga de todo un registro del Maestro a los nietos, la parte de atrás es la única manera de hacer esto. Eso hizo que las Potencias que sea alegre. Pero, ya sabes, los usuarios mentira, y por lo que resulta posible que tengamos que cambiar esto (tanto por lo que no tiene que servir como el ocasional Registro Oficial Deleter y porque hay ciertos tipos de Gen 2 usuarios registra eliminar con frecuencia .

eliminaciones en cascada eran la primera opción, ya que los poderes fácticos preferirían esto no requerir un trabajo en una nueva versión de la aplicación. Y porque es lo que salió de la boca de mis jefes al final de esa reunión en particular. Mis Gen 2 -> Gen 3 cascadas están trabajando bien (y esto cubre el uso más frecuente del caso / de la historia / ¿Qué has). entonces he actualizado todo el Maestro -> Gen 2 claves externas a Cascade en Eliminar. En esperaban Esto permitiría una supresión del registro maestro y que todos los otros niños y nietos irían con él. No es bueno; Me aparece un mensaje de error que viola el primer Master -> Gen 2 FK aparece cuando se intenta eliminar el registro maestro. He comprobado doble; FKs se establecen en cascada de eliminación.

¿Qué no estoy comprensión acerca de eliminaciones en cascada con más de 1 nivel de relaciones de la tabla? Estoy leyendo tanto como pueda (como el tiempo lo permite), pero aún no he descubierto el conocimiento que me llevará a cabo de este tiempo oscuro. Está en cascada el enfoque equivocado?

En segundo lugar, hay otras dos opciones como lo veo:

  1. Hacer todo su eliminación en la aplicación. No se prefiere, pero si es la única opción es la única opción. Sé que hay argumentos de que es la mejor opción, pero los poderes fácticos tienen diferentes puntos de vista mejor que yo (y mientras todos están batshit loco, que firman los cheques).

  2. Mango elimina a través de gatillo? Estoy claro si claves externas conseguirá enla forma de esto, pero se me ocurrió que esto podría ser una opción.

Bueno, también:

  1. Haga el Gen 2 -> Gen 3 en cascada. Y luego las pocas personas con permisos de eliminación sólo tendrán que seguir los rituales para hacer el borrado completo (que sería: borrar todos los registros de forma individual Gen 2, a continuación, eliminar el maestro). O bien, voy a estar atrapado como el Registro Oficial Deleter.
¿Fue útil?

Solución 2

Así que, al parecer, que había algo malo con uno o más de mis relaciones (borrar en el extremo posterior dejado más claro). Puse una copia nueva de la base de datos y volver a aplicar mis guiones y ahora todo está funcionando. Este artículo en MSDN me ayudó a comprender el problema tenía que ser uno de mis relaciones. Y fue muy útil en general.

Así que vamos a ver qué deciden los poderes fácticos que debería hacer a continuación.

Otros consejos

Todo el código T-SQL que iba a escribir "manualmente" borrar hijos, nietos, et. Alabama. se podría cargar en un desencadenador en la tabla MasterRecord, pero me considero que para ser una solución horrible, si no por otra razón que ofusca gravemente la funcionalidad de base de datos críticos.

lo haría dentro de la aplicación (o, de preferencia, dentro de un procedimiento almacenado). Pero si eso no es una opción, entonces sí, parece que le pegan con disparadores o eliminaciones en cascada (y tal vez una combinación de ambos). Se puede mentir a los poderes fácticos? ¿El "lo que no saben no te hará daño" se aplica la regla?

Nunca he hecho cascading eliminado, y los dioses dispuestos que nunca lo haré. Estoy deseando leer el post de otra persona que responde a su pregunta.

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