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

Trigger Insert After Update

Estas en el tema de Trigger Insert After Update en el foro de Mysql en Foros del Web. Al grano... El problema se plantea de la siguiente manera. Existe una tabla de productos. Y tiene varios campos, pero solo señalaré los que me ...
  #1 (permalink)  
Antiguo 09/06/2010, 02:18
 
Fecha de Ingreso: diciembre-2009
Mensajes: 19
Antigüedad: 14 años, 4 meses
Puntos: 0
Trigger Insert After Update

Al grano...

El problema se plantea de la siguiente manera.

Existe una tabla de productos. Y tiene varios campos, pero solo señalaré los que me interesan en la resolucion del problema.

Una tabla de productos tiene los campos.

Nombre de Producto (nombrep), Precio de Compra (preciocompra), y Precio de Venta.

La operación debería ser poder capaz de capturar "solo" el nombre del producto y el precio de compra, y automaticamente generar el precio de venta que sería igual a

Precio de compra + 15%.

El camino que imagine para resolverlo fue, que se insertarán los datos, y despues de que se hubieran insertado, actualizar el precio de venta.

Un trigger llama a un Stored Procedure.

Crear la BD y la tabla
Código MySQL:
Ver original
  1. create database laprueba;
  2.  
  3. create table laprueba(nombrep varchar(20), preciocompra decimal(6,2), precioventa decimal(6,2));

El Stored Procedure
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS `examenextra`.`pstored`$$
  3. CREATE PROCEDURE `examenextra`.`pstored` (in nomp varchar(20), in preciov decimal(6,2))
  4.  
  5. update laprueba
  6. set laprueba.precioventa = preciov
  7. where nombrep = nomp;
  8.  
  9. END$$
  10. DELIMITER ;

El Trigger
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS `examenextra`.`ponpreven`$$
  3. CREATE TRIGGER `examenextra`.`ponpreven` before INSERT on `examenextra`.`laprueba`
  4.   DECLARE preciov decimal;
  5.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET preciov = 0;
  6.   select preciocompra*(0.15) into preciov from laprueba where nombrep = new.nombrep;
  7.  call pstored(new.nombrep, preciov);
  8. END$$
  9. DELIMITER ;

Según yo, esto deberia funcionar, como estoy aquí, esto logicamente no funciona. Despues de ejecutar la consulta

Código MySQL:
Ver original
  1. insert into laprueba values("algo", 120, 0);

El error que arroja es el siguiente:

Código ErrorMySQL:
Ver original
  1. Can't update table 'laprueba' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

También se que cuando se está insertando la tabla está bloqueada o algo así. Tengo nociones de lo que le sucede a la tabla. Pero honestamente no me interesa mucho, me interesa más como realizar esas acciones sin obtener el error, o alguna manera alternativa de hacerlo, pero igual usando stored y triggers.

¿Alguna idea?

Muchas gracias.

Última edición por DilakV; 09/06/2010 a las 07:34
  #2 (permalink)  
Antiguo 09/06/2010, 07:39
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Trigger Insert After Update

Ya haz probado el trigger en after y no before?

Cuando le dices before, es necesario culminar las sentencias del trigger antes de insertar el registro y lo que haces es tratar de actualizar un registro que está en la cola, ya que n0 han culminado las lineas del trigger.

Pruebalo y nos cuentas.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/06/2010, 19:39
 
Fecha de Ingreso: diciembre-2009
Mensajes: 19
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Trigger Insert After Update

Código MySQL:
Ver original
  1. Can't update table 'laprueba' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Si, olvide decir que también ya habia intentado after... y me arroja exactamente el mismo error.

¿alguna idea?

Probablemente no exactamente como lo que estoy planteando. O bueno, alguna manera alternativa de hacerlo. Soy un neófito, como puede notarse.

Muchas gracias.
  #4 (permalink)  
Antiguo 09/06/2010, 20:12
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: Trigger Insert After Update

Error principal:

Cita:
El disparador no puede invocar procedimientos almacenados utilizando la sentencia CALL. (Esto significa, por ejemplo, que no se puede utilizar un procedimiento almacenado para eludir la prohibición de referirse a tablas por su nombre).
(Manual de Referencia: 20.3. Utilización de disparadores

Segundo nivel de error:
No se puede invocar en un TRIGGER una tabla que ya se está usando.
Código MySQL:
Ver original
  1. INSERT INTO laprueba VALUES("algo", 120, 0);
Usas la tabla "laprueba". Esta acción dispara el TRIGGER, que a su vez contiene esta sentencia:
Código MySQL:
Ver original
  1. SELECT preciocompra*(0.15) INTO preciov FROM laprueba WHERE nombrep = new.nombrep;
Estás invocando la misma tabla que genera el evento...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 09/06/2010, 21:43
 
Fecha de Ingreso: diciembre-2009
Mensajes: 19
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Trigger Insert After Update

Si, muchas gracias.

Precisamente ya habia dicho yo que sabia que el error era que al usar un insert e invocar un update en el trigger provocaba un error.

Según yo, por que la tabla se bloquea para realizar el insert, de hecho lo adecuado, sería insertarlo en una nueva tabla.

Pero precisamente el problema me plantea poner el precioventa, segun el preciocompra introducido. Ese es el problema planteado.

La pregunta es: ¿Cómo resolverlo?

Basándome en un poquito de lógica concebi el stored y el trigger como lo describía en el primer post, esto no funciona, y sé por que no funciona (por que la tabla esta bloqueada, bla bla).

Pero entonces, ¿Alguna idea de como podría resolverlo?

Espero se perdone mi "novatez".

Muchas gracias por sus respuestas.
  #6 (permalink)  
Antiguo 09/06/2010, 21:55
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: Trigger Insert After Update

En realidad cuesta entender el sentido de este ejercicio, porque la respuesta sería:
Código MySQL:
Ver original
  1. INSERT INTO laprueba VALUES("algo", 120, ROUND((120 * 1.15), 2));
Pero aún así, considerando que la tabla
Código MySQL:
Ver original
  1. CREATE TABLE laprueba(
  2.     nombrep VARCHAR(20),
  3.     preciocompra DECIMAL(6,2),
  4.     precioventa DECIMAL(6,2));
no tiene definido precioventa como NOT NULL, el trigger sería probablemente:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS `examenextra`.`ponpreven`$$
  3. CREATE TRIGGER `examenextra`.`ponpreven` before INSERT on `examenextra`.`laprueba`
  4.   SET NEW.precioventa = NEW.preciocompra * 1.15;
  5. END$$
  6. DELIMITER ;
Ten en cuenta que un INSERT no crea sólo el conjunto de campos que estás insertando, sino todos los campos del registro, por lo que "precioventa" existe como objeto, y como tal es accesible con la pseudovariable NEW. Entonces, para llenarlo solamente debes actualizar su valor con el resultado deseado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 09/06/2010, 23:25
 
Fecha de Ingreso: diciembre-2009
Mensajes: 19
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Trigger Insert After Update

La naturaleza del ejercicio, ni yo la sé. Aún no se lo encuentro. Pero es cosa de mi Asesor Escolar.

Y si, el trigger que me proporcionas funciona correctamente. Considero que es correcto. De hecho mas o menos asi lo habia concebido, en solo un trigger.

Lo que me confunde es eso de meter ese procedimiento en un Stored Procedure y mandarlo desde el trigger. :S

En fin.

Muchas gracias por cierto.
  #8 (permalink)  
Antiguo 09/06/2010, 23:42
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: Trigger Insert After Update

Cita:
Lo que me confunde es eso de meter ese procedimiento en un Stored Procedure y mandarlo desde el trigger. :S
Habría que ver ni el AE no está pensando en otro DBMS y no en MySQL. Algunas funcionalidades y capacidades cambian entre diferentes sistema de bases de datos.
__________________
¿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: insert, trigger, update
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 00:41.