Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Stored Procedure - Borrar

Estas en el tema de Stored Procedure - Borrar en el foro de Mysql en Foros del Web. Hola Quisiera saber como hacer un apropiado Stored Procedure para eliminar un registro de una tabla. Por el momento tengo el siguiente ejemplo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 13/05/2010, 17:45
 
Fecha de Ingreso: abril-2010
Mensajes: 36
Antigüedad: 14 años, 8 meses
Puntos: 2
Stored Procedure - Borrar

Hola

Quisiera saber como hacer un apropiado Stored Procedure para eliminar un registro de una tabla. Por el momento tengo el siguiente ejemplo:

Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`%` PROCEDURE `cm_sp_linea_negocio_borrar`(
  2. in param_cod_empresa CHAR(5),
  3. in param_cod_linea_neg CHAR(3))
  4.  
  5. delete from linea_negocio
  6. where cod_empresa=param_cod_empresa and cod_linea_neg=param_cod_linea_neg;
  7. select 'La linea de negocio ha sido eliminada satisfactoriamente.' as 'Mensaje';
  8.  

Lo ideal seria que MySQL no me envie mensaje de error avisandome que ese registro esta siendo utilizado en otra tabla como FK. Estoy llamando el SP desde .net y si ocurre el error se caeria el programa.
Habra alguna forma de verificar ese error y poder enviar un mensaje de error manualmente creado por mi en lugar de que se vaya por el error de FK de MySQL?

Ojala puedan ayudarme, gracias.
  #2 (permalink)  
Antiguo 13/05/2010, 18:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Stored Procedure - Borrar

Tu problema no es el SP, es que no está entendiendo bien el modelo E-R, ni tampoco programando bien en .Net (sin ofender).
Vamos por partes:
1) Una restricción de FK es una restricción de integridad referencial y no la puedes violar así porque sí.
Lo que te está diciendo el MySQL es que hay al menos un registro en una tabla que depende del valor del registro que pretendes borrar... Eso no se puede ni se debe hacer.
Imagina que se trata de borrar un registro de la tabla Empleado, y te quedan los de CargasSociales de ese empleado, donde figuran los hijos. Si el empleado se fué, renunció o fue despedido, no tiene ningún sentido que los hijos sigan figurando en la base, ya que no hay a quién hacerle retenciones ni aportes al sueldo por sus cargas sociales...
Ese es un caso de dependencia de integridad referencial: Si el empelado desaparece, las cargas sociales del empleado también.
¿Se entiende?
¿Cómo se maneja eso?: O borras los registro dependientes primero, o bien reconfiguras la otra tabla para que se borre en cascada, en caso de borrarse la PK referida... No hay otra.
En esos casos se debe agregar, a la definición del la FK en la tabla el ON DELETE CASCADE ON UPDATE CASCADE.

2) Cuando dices:
Cita:
. Estoy llamando el SP desde .net y si ocurre el error se caeria el programa.
es evidente que te falta programación en .Net, porque deberías conocer las estructuras Try/Catch/End Try, que se implementan, precisamente, para controlar los posibles errores y excepciones que puedan ocurrir en determinadas circunstancias.
Además, es evidente que no estás usando correctamente las excepciones, porque MySQL devuelve determinadas excepciones propias (MysqlException) que son perfectamente administrables cuando usas el MySQL Connector.Net.
Te sugiero una visita a la página respectiva en el manual de referencia: MySQL :: 25.2 MySQL Connector.NET, donde encontrarás ejemplos y detalles del uso de este conector.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: borrar, procedure, stored
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:18.