none
Eliminar registros de una tabla sin afectar a otras tablas RRS feed

  • Pregunta

  • Buenas disculpen las molestias.

    Resulta que tengo tres tablas. Tabla "usuarios" , "profesional" y "atencion".

    La tabla "Usuario", tiene una clave principal y una foranea llamada "Matricula" que enlaza a la tabla Profesional.

    La tabla "Profesional" , tiene como llave primaria "Matricula".

    La tabla "Atención", tiene su llave primaria mas una foranea llamada "Matricula", que enlaza a la tabla "Profesional".

    Creo un procedimiento almacenado llamado "Eliminar_Profesional", donde busco eliminar los datos en la tabla "Usuario" y "Profesional". Pero en la tabla "Atencion" quiero que queden los registros de la atención realizada por ese profesional eliminado.

    No se si me explico. 

    dejo el procedimiento, a pesar que hace lo que pido, quiero saber si ese error puede comprometer la seguridad o la ejecución de código

    jueves, 15 de junio de 2017 20:10

Respuestas

  • Buenas JulianLam

    Lo que planteas si que puede llegar a ser un problema, porque si dejas registrados datos con una clave foranea que dirige a algo que no existe, pues problemas... Porque quieres borrar datos de la tabla Profesional dejando las otras, para dar de baja esa matricula?? si quieres "eliminar" los datos de esa tabla, podrías crear un campo más que te indique si esta habilitado o no, y añadir ese campo en tus clausulas where para evitar que los select te devuelvan datos que tu has "eliminado", solo que los datos si van a seguir estando, pudiendo recuperarlos cuando a ti te haga falta, y sobre todo, no vas a generar inconsistencia en la base de datos.

    Atte.


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    • Marcado como respuesta JulianLam jueves, 15 de junio de 2017 20:35
    jueves, 15 de junio de 2017 20:19
  • Estimado JulianLam:

    En las propiedades de la relaciona foránea, al momento de crearla:


    De todos modos revisa, para mayor entendimiento, el siguiente link.


    Saludos cordiales.


    Camilo Villa

    • Propuesto como respuesta Jorge TurradoMVP jueves, 15 de junio de 2017 21:36
    • Marcado como respuesta JulianLam viernes, 16 de junio de 2017 17:59
    jueves, 15 de junio de 2017 21:30

Todas las respuestas

  • Buenas JulianLam

    Lo que planteas si que puede llegar a ser un problema, porque si dejas registrados datos con una clave foranea que dirige a algo que no existe, pues problemas... Porque quieres borrar datos de la tabla Profesional dejando las otras, para dar de baja esa matricula?? si quieres "eliminar" los datos de esa tabla, podrías crear un campo más que te indique si esta habilitado o no, y añadir ese campo en tus clausulas where para evitar que los select te devuelvan datos que tu has "eliminado", solo que los datos si van a seguir estando, pudiendo recuperarlos cuando a ti te haga falta, y sobre todo, no vas a generar inconsistencia en la base de datos.

    Atte.


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    • Marcado como respuesta JulianLam jueves, 15 de junio de 2017 20:35
    jueves, 15 de junio de 2017 20:19
  • Hola jorge, si se en que problema me puedo meter. Lo que pasa es que si el profesional esta o no, las atenciones que se realizaron también se deben computar, por eso no quiero eliminar los registros que haya realizado ese profesional. No entiendo muy bien la idea que planteas soy medio nuevo en esto >D
    jueves, 15 de junio de 2017 20:26
  • Ahi entendi lo que planteaste. Graciasss por el dato
    jueves, 15 de junio de 2017 20:35
  • Hola JulianLam

    Varias cosas: 

    1. Cuando creas una relación de tabla con clave foránea, existe la opción donde especificas si deseas o no la opción de borrado en cascada o no, para el caso puntual debiste haberla creado como "NO borrar en cascada" y "NO validar integridad referencial".
    2. El procedimiento almacenado que tienes rompe las reglas de la homogeneidad de la información, porque... sencillo, borra la foreing key "FK_ATENCION_PROFESIONAL", para permitir eliminar información de la tabla "PROFESIONAL" y "USUARIOS", y luego tratas de crear la misma clave nuevamente, respetando integridad referencial la cual fue completamente des-legitimado con los pasos anteriores.

    Soluciones posibles:

    1. Eliminar las relaciones, y manejar las relaciones de integridad en las reglas de negocio (sean en procedimientos almacenados o en clases de la capa de acceso a datos).
    2. Crear una tabla de históricos de atención, donde llevas el registro de los profesionales que se eliminan, y les manejas un estado. e igual la tabla te puede servir de consulta de históricos, y dejas la otra como tabla transaccional.
    3. Modificar las restricciones de las claves foraneas para que no validen integridad referencial (lo cual no tiene lógica) y no eliminen en cascada.

    Saludes cordiales.


    Camilo Villa

    jueves, 15 de junio de 2017 20:51
  • Hola Camilo tenes un ejemplo de como especificar o no el borrado en cascada? 
    jueves, 15 de junio de 2017 21:00
  • Estimado JulianLam:

    En las propiedades de la relaciona foránea, al momento de crearla:


    De todos modos revisa, para mayor entendimiento, el siguiente link.


    Saludos cordiales.


    Camilo Villa

    • Propuesto como respuesta Jorge TurradoMVP jueves, 15 de junio de 2017 21:36
    • Marcado como respuesta JulianLam viernes, 16 de junio de 2017 17:59
    jueves, 15 de junio de 2017 21:30
  • No tiene sentido lo que planteas, no puedes eliminar la referencia porque los datos referenciados pierden consistencia, pierden sentido. Si una instancia de la entidad 'Profesional' tiene operaciones entonces no se elimina, se cambia de estado o si lo quieres ver de manera práctica: se da de baja.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 16 de junio de 2017 0:55
  • Gracias Camilo por el dato
    viernes, 16 de junio de 2017 17:59