Páginas: [1]
|
 |
|
Autor
|
Tema: Duda con el uso de triggers en Mysql (Detener un insert) (Leído 388 veces)
|
Soul Lost
GNU/Linux
Desconectado
Mensajes: 2.450
|
Eso, estoy usando un trigger pero quisiera saber si es posible detener un insert mediante la evaluación de una condición de dicho disparador, en sqlserver podíamos hacer uso de disparadores y transacciones al mismo tiempo, pero leyendo la documentación de mysql dice que no es posible usar un ROLLBACK en un disparador, alguien sabe cuál sería la posible solución? Saludos!! 
|
|
|
|
|
En línea
|
Siempre hay algo nuevo que aprender Mi NUEVO BLOG: soullost.org
|
|
|
P[i]
Desconectado
Mensajes: 432
www.SinLaMula.com - stage6.divx.com
|
Bueno, no se exactamente lo que quieres hacer, pero puedes meterle check a la tabla para verificar datos no, ya no te haria falta triger, aunque como lla dije no se que es lo que quieres hacer exactamente, pero para los insert si prepras bien la tabla antes no deberias tener problema, no??. Si esto no te vales podrias especifcar para que quieres el triger exactamente. saludos.
|
|
|
|
|
En línea
|
|
|
|
Soul Lost
GNU/Linux
Desconectado
Mensajes: 2.450
|
Tengo dos tablas: Ventas y Productos: +--------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------+------+-----+---------+-------+ | Codigo | int(11) | NO | PRI | | | | Descripccion | char(30) | NO | | | | | Precio | float | NO | | | | | Existencia | int(11) | NO | | 0 | | +--------------+----------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
+----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+-------+ | Folio | char(30) | NO | PRI | | | | Codigo | int(11) | NO | PRI | | | | Cantidad | int(11) | NO | | | | | Precio | float | NO | | | | +----------+----------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
El uso del trigger (disparador) lo uso para cuando una nueva venta se realza y se ingresa en la base de datos, al mismo tiempo disminuya la existencia del producto respecto a la cantidad del mismo que se haya vendido. En el trigger existe una condición donde se verifica lo siguiente: DECLARE num Integer;
select PRODUCTO.Existencia into num from PRODUCTO where PRODUCTO.Codigo = NEW.Codigo;
IF num > NEW.Cantidad THEN
update PRODUCTO set Existencia=Existencia-NEW.Cantidad where PRODUCTO.Codigo = NEW.Codigo;
END IF;
El problema viene cuando a pesar de que la existencia sea menor a la cantidad que quiera vender, el registro se ingresa y por lo tanto, la existencia no se ve afectada. Lo decía al principio del tema, en sqlserver se puede detener la inserción del registro con un ROLLBACK, pero en mysql no es posible.
|
|
|
|
|
En línea
|
Siempre hay algo nuevo que aprender Mi NUEVO BLOG: soullost.org
|
|
|
P[i]
Desconectado
Mensajes: 432
www.SinLaMula.com - stage6.divx.com
|
Sorry por tardar tanto, pero tenia un trancazo y no tenia ganas de estar delante del ordenador. La documentacion es clara http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html no se puede usar rollback en un trigger con mysql, como tu dijiste. Por desgracia para tu caso solo queda la programacion, por lo menos hasta lo que yo se de sql, pero puedes preguntar en el foro oficial de mysql haber si te pueden dar una alternativa al rollbak para tu caso, esponle tu codigo, asi te contestan antes. Sorry por no poderte ser de mas ayuda y perdona tambien por tardar tanto en contestar.
|
|
|
|
|
En línea
|
|
|
|
P[i]
Desconectado
Mensajes: 432
www.SinLaMula.com - stage6.divx.com
|
Bueno creo que tarde pero al final encontre una posible solucion. No utilice trigger pero utilice procedimientos que tambien se ejecuta en bd. Bueno te dejo el procedure aqui por si a alguien le hace falta. #DROP PROCEDURE Insertar_Ventas;
delimiter // CREATE PROCEDURE Insertar_Ventas(IN Folio char, IN Cod int, IN Cantidad int, IN Precio float ) BEGIN declare num INT; SELECT producto.existencia INTO num FROM producto WHERE producto.codigo = Cod; IF num-cantidad >= 0 THEN insert into venta values (Folio,Cod,Cantidad,Precio); update producto set existencia=existencia-Cantidad; END IF; END; //
call Insertar_Ventas(1,1,3,10.2);
Saludos.
|
|
|
|
|
En línea
|
|
|
|
Hans el Topo
Desconectado
Mensajes: 1.688
"Estoy cansado de no hacer nada"
|
hace tiempo que no utilizo triggers, veamos si me acuerdo, los triggers se puedes disparar antes y después de un insert, por lo tanto la comprobación la haces antes y no después como estabas haciendo
pon la cabecera del trigger
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: [1]
|
|
|
|