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

Problema con Trigger BEFORE DELETE en CASCADE

Estas en el tema de Problema con Trigger BEFORE DELETE en CASCADE en el foro de Mysql en Foros del Web. Hola, tengo un problema con mysql tengo 3 tablas, recepcion, recepcion_detalle y articulos. recepcion_detalle tiene como clave id_recepcion y id_articulo (ambas foraneas, respectivamente) en el ...
  #1 (permalink)  
Antiguo 11/11/2013, 11:16
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Problema con Trigger BEFORE DELETE en CASCADE

Hola, tengo un problema con mysql

tengo 3 tablas, recepcion, recepcion_detalle y articulos. recepcion_detalle tiene como clave id_recepcion y id_articulo (ambas foraneas, respectivamente) en el TRIGGER BEFORE DELETE de recepcion_detalle tengo esto:

Código SQL:
Ver original
  1. UPDATE articulos SET stock=stock-OLD.cantidad WHERE articulos.id_articulo=OLD.id_articulo

que funciona bien para los DELETE manuales.

pero, le puse que la clave foranea id_recepcion ON DELETE CASCADE para que al borrar la recepción, se borren todos los detalles de esta. el problema esta en que cuando borro una recepción, se borran sus detalles pero no se dispara el TRIGGER antes mencionado.

¿Estoy haciendo algo mal, o no se puede haces esto con MySQL?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 11/11/2013, 11:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con Trigger BEFORE DELETE en CASCADE

Cita:
el problema esta en que cuando borro una recepción, se borran sus detalles pero no se dispara el TRIGGER antes mencionado.
DELETE no es UPDATE.
Si estás borrando la tabla (DELETE), eso no es una actualización (UPDATE), por lo tanto no aplica el evento para el que definiste el TRIGGER.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 11/11/2013, 11:56
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Problema con Trigger BEFORE DELETE en CASCADE

Hola gnzsoloyo, como siempre, gracias por tus respuestas. Quizás me explique mal, el evento lo tengo definido en BEFORE DELETE (tambien hay otros para UPDATE e INSERT, pero no tienen relación con esto (creo))

El update que puse, es el codigo que ejecuta el TRIGGER BEFORE DELETE cuando, por ejemplo, hago esto:
Código SQL:
Ver original
  1. DELETE FROM recepcion_detalle WHERE id_recepcion = 3 AND id_articulo = 2

Ahi si se dispara el trigger correctamente.

Pero si borro un registro de la tabla recepcion este registro borra en cascada los de recepcion_detalle que estan vinculados sin disparar el trigger como si lo hace un borrado manual

espero haberme explicado un poco mejor
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 11/11/2013, 15:56
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Problema con Trigger BEFORE DELETE en CASCADE

Concretamente tengo esto:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `articulos` (
  2.   `id_articulo` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3.   `codigo_proveedor` char(10) COLLATE utf8_bin NOT NULL,
  4.   `codigo_articulo` char(10) COLLATE utf8_bin NOT NULL,
  5.   `codigo_color` char(10) COLLATE utf8_bin NOT NULL,
  6.   `talle` char(10) COLLATE utf8_bin NOT NULL,
  7.   `descripcion` char(200) COLLATE utf8_bin NOT NULL DEFAULT '---',
  8.   `fecha_alta` datetime NOT NULL,
  9.   `costo` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
  10.   `precio_venta` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
  11.   `stock` int(10) unsigned NOT NULL,
  12.   `habilitado` tinyint(1) NOT NULL,
  13.   PRIMARY KEY (`id_articulo`),
  14.   UNIQUE KEY `codigo` (`codigo_proveedor`,`codigo_articulo`,`codigo_color`,`talle`),
  15.   KEY `codigo_articulo` (`codigo_articulo`),
  16.   KEY `codigo_color` (`codigo_color`)
  17.  
  18. --
  19. -- Volcado de datos para la tabla `articulos`
  20. --
  21.  
  22. INSERT INTO `articulos` (`id_articulo`, `codigo_proveedor`, `codigo_articulo`, `codigo_color`, `talle`, `descripcion`, `fecha_alta`, `costo`, `precio_venta`, `stock`, `habilitado`) VALUES
  23. (11, 'marca1', 'art1', '1', 'A', '---', '2013-11-11 00:00:00', '10.00', '20.00', 6, 1);
  24.  
  25.  
  26. -- RECEPCIONES DETALLE --
  27.  
  28. CREATE TABLE IF NOT EXISTS `recepciones` (
  29.   `id_recepcion` int(10) unsigned NOT NULL AUTO_INCREMENT,
  30.   `fecha_alta` datetime NOT NULL,
  31.   `fecha_actualizacion` datetime DEFAULT NULL,
  32.   `codigo_proveedor` char(10) COLLATE utf8_bin NOT NULL,
  33.   `descripcion` char(200) COLLATE utf8_bin NOT NULL DEFAULT '---',
  34.   `total` decimal(10,2) NOT NULL,
  35.   PRIMARY KEY (`id_recepcion`),
  36.   KEY `codigo_proveedor` (`codigo_proveedor`)
  37.  
  38. --
  39. -- Volcado de datos para la tabla `recepciones`
  40. --
  41.  
  42. INSERT INTO `recepciones` (`id_recepcion`, `fecha_alta`, `fecha_actualizacion`, `codigo_proveedor`, `descripcion`, `total`) VALUES
  43. (12, '2013-11-11 17:23:29', NULL, 'marca1', 'dsfs', '10.00'),
  44. (19, '2013-11-11 17:48:18', '2013-11-11 18:17:07', 'marca1', '', '50.00');
  45.  
  46.  
  47. -- RECEPCION DETALLE --
  48.  
  49. CREATE TABLE IF NOT EXISTS `recepcion_detalle` (
  50.   `id_recepcion` int(10) unsigned NOT NULL,
  51.   `id_articulo` int(10) unsigned NOT NULL,
  52.   `cantidad` int(10) NOT NULL,
  53.   `costo` decimal(10,2) unsigned NOT NULL,
  54.   PRIMARY KEY (`id_recepcion`,`id_articulo`),
  55.   KEY `id_articulo` (`id_articulo`)
  56.  
  57. CREATE TRIGGER `borrar_articulo` BEFORE DELETE ON `recepcion_detalle`
  58.  FOR EACH ROW UPDATE articulos SET stock=stock-OLD.cantidad WHERE articulos.id_articulo=OLD.id_articulo
  59.  
  60. --
  61. -- Volcado de datos para la tabla `recepcion_detalle`
  62. --
  63.  
  64. INSERT INTO `recepcion_detalle` (`id_recepcion`, `id_articulo`, `cantidad`, `costo`) VALUES
  65. (12, 11, 1, '10.00'),
  66. (19, 11, 5, '10.00');
  67.  
  68. ALTER TABLE `recepcion_detalle`
  69.   ADD CONSTRAINT `recepcion_detalle_ibfk_4` FOREIGN KEY (`id_recepcion`) REFERENCES `recepciones` (`id_recepcion`) ON DELETE CASCADE ON UPDATE CASCADE,
  70.   ADD CONSTRAINT `recepcion_detalle_ibfk_2` FOREIGN KEY (`id_articulo`) REFERENCES `articulos` (`id_articulo`) ON UPDATE CASCADE;
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #5 (permalink)  
Antiguo 12/11/2013, 07:28
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Problema con Trigger BEFORE DELETE en CASCADE

Encontre este tema con un problema similar donde sugieren crear un usuario para el trigger con todos los privilegios. asi lo hice:

Código MySQL:
Ver original
  1. GRANT ALL PRIVILEGES ON *.* TO 'nehuen'@'localhost' IDENTIFIED BY PASSWORD '***' WITH GRANT OPTION;

Código MySQL:
Ver original
  1. CREATE DEFINER =  `nehuen`@`localhost` TRIGGER `borrar_articulo` BEFORE DELETE ON  `recepcion_detalle` FOR EACH ROW UPDATE articulos SET stock = stock - OLD.cantidad WHERE articulos.id_articulo = OLD.id_articulo

Pero sigue sin funcionar :( alguien puede darme una mano por favor?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #6 (permalink)  
Antiguo 12/11/2013, 16:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con Trigger BEFORE DELETE en CASCADE

Cita:
Iniciado por NSD Ver Mensaje
Hola gnzsoloyo, como siempre, gracias por tus respuestas. Quizás me explique mal, el evento lo tengo definido en BEFORE DELETE (tambien hay otros para UPDATE e INSERT, pero no tienen relación con esto (creo))

El update que puse, es el codigo que ejecuta el TRIGGER BEFORE DELETE cuando, por ejemplo, hago esto:
Código SQL:
Ver original
  1. DELETE FROM recepcion_detalle WHERE id_recepcion = 3 AND id_articulo = 2

Ahi si se dispara el trigger correctamente.

Pero si borro un registro de la tabla recepcion este registro borra en cascada los de recepcion_detalle que estan vinculados sin disparar el trigger como si lo hace un borrado manual

espero haberme explicado un poco mejor
Tu respuesta es muy simple, y la puedes leer en el manual de referencia:
Cita:
Restrictions for Triggers

For triggers, the following additional restrictions apply:

+ Triggers are not activated by foreign key actions.

(...)
En esencia: No funciona sobre las FK.
__________________
¿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: cascade, delete, sql, tabla, trigger
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 11:42.