Autor
|
Tema: Trigger complejos MySQL (Leído 5,570 veces)
|
rubcr
Desconectado
Mensajes: 51
|
Hola a todos. Tengo que crear unos triggers y son bastante liosos para mi ya que no tengo el suficiente nivel para ello. Las tablas dadas son las siguientes: CREATE TABLE Pedido( id_pedido INT PRIMARY KEY, fecha_ped DATE, total FLOAT, iva VARCHAR, id_vendedor INT, id_cliente INT, ); CREATE TABLE Producto( id_producto INT PRIMARY KEY, descripcion VARCHAR, stock INT, precio FLOAT, estrellas INT(1) ); CREATE TABLE Inventario( id_pedido INT, id_producto INT, cantidad INT DEFAULT 1, PRIMARY KEY(id_pedido, id_producto), CONSTRAINT FK_Inventario_Pedido FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido), CONSTRAINT FK_Inventario_Producto FOREIGN KEY (id_producto) REFERENCES Producto(id_producto) );
Los triggers son: 1.Trigger que al introducir una fila en la tabla que nace de la relación entre pedido y producto (inventario) , compruebe que en la tabla producto hay stock y sino tiré un warning. 2.Trigger que tras introducir un nuevo producto compruebe que el precio es mayor que 0. Si es menor o igual a 0, el trigger deberá eliminar el artículo que se ha insertado. Espero que alguien pueda ayudarme. Un saludo.
|
|
« Última modificación: 3 Junio 2020, 18:45 pm por rubcr »
|
En línea
|
|
|
|
MCKSys Argentina
|
|
|
|
En línea
|
MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
rubcr
Desconectado
Mensajes: 51
|
Hola gracias por el tutorial, pero no se ajusta al tipo de triggers que necesito ya que estos triggers no incluyen los datos generados en una tabla adicional. Un saludo.
|
|
|
En línea
|
|
|
|
K-YreX
Desconectado
Mensajes: 1.008
|
Los triggers son: 1.Trigger que al introducir una fila en la tabla que nace de la relación entre pedido y producto (inventario) , compruebe que en la tabla producto hay stock y sino tiré un warning. En este caso puedes crear un trigger BEFORE INSERT que compruebe lo que tú dices y en caso de que no sea válido puedes ejecutar: SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insercion no valida...'
Te dejo un link para que leas más acerca de ello: https://dev.mysql.com/doc/refman/8.0/en/signal.html2.Trigger que tras introducir un nuevo producto compruebe que el precio es mayor que 0. Si es menor o igual a 0, el trigger deberá eliminar el artículo que se ha insertado.
De la misma forma que antes. En vez de insertar el producto y después de la inserción, comprobar la validez del mismo; puedes usar un trigger BEFORE INSERT y lanzar otro error si no se cumple la condición de validez del registro.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
rubcr
Desconectado
Mensajes: 51
|
En este caso puedes crear un trigger BEFORE INSERT que compruebe lo que tú dices y en caso de que no sea válido puedes ejecutar: SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insercion no valida...'
Te dejo un link para que leas más acerca de ello: https://dev.mysql.com/doc/refman/8.0/en/signal.htmlDe la misma forma que antes. En vez de insertar el producto y después de la inserción, comprobar la validez del mismo; puedes usar un trigger BEFORE INSERT y lanzar otro error si no se cumple la condición de validez del registro. Puedes ayudarme un poco con la sintaxis porque no se muy bien como estructurarlo y que seleccionar a parte de lo que me indicas.
|
|
|
En línea
|
|
|
|
K-YreX
Desconectado
Mensajes: 1.008
|
Veo que el código que has puesto al comienzo del tema está completado en base a mi respuesta de este otro tema: https://foro.elhacker.net/bases_de_datos/pasar_a_mysql-t505018.0.html;msg2222689#msg2222689, lo que me hace pensar que no estás empleando ningún esfuerzo en hacerlo por ti mismo. El foro es para ayudar, no para hacer tareas. No puedes esperar que te den todos los problemas solucionados porque en algún momento de tu vida tendrás que hacerlo tú solo y entonces no sabrás ni por dónde empezar. Ya tienes un punto de referencia para saber por donde empezar, además tienes muchísima información tanto en otros temas del foro como en Internet sobre cómo hacer triggers. Inténtalo tú e investiga sobre los problemas que tengas. Y cuando no encuentres información o no entiendas cómo solucionar un problema, aporta tu código para que alguien de la comunidad pueda ayudarte.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
rubcr
Desconectado
Mensajes: 51
|
Veo que el código que has puesto al comienzo del tema está completado en base a mi respuesta de este otro tema: https://foro.elhacker.net/bases_de_datos/pasar_a_mysql-t505018.0.html;msg2222689#msg2222689, lo que me hace pensar que no estás empleando ningún esfuerzo en hacerlo por ti mismo. El foro es para ayudar, no para hacer tareas. No puedes esperar que te den todos los problemas solucionados porque en algún momento de tu vida tendrás que hacerlo tú solo y entonces no sabrás ni por dónde empezar. Ya tienes un punto de referencia para saber por donde empezar, además tienes muchísima información tanto en otros temas del foro como en Internet sobre cómo hacer triggers. Inténtalo tú e investiga sobre los problemas que tengas. Y cuando no encuentres información o no entiendas cómo solucionar un problema, aporta tu código para que alguien de la comunidad pueda ayudarte. Para el primero tengo esto: CREATE TRIGGER test_stock AFTER INSERT ON inventario FOR EACH ROW BEGIN IF (producto.stock < 0) THEN SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning: No hay stock disponible!'; END IF; END$$ DELIMITER ;
No me genera nada y no sé por qué está mal.
|
|
|
En línea
|
|
|
|
K-YreX
Desconectado
Mensajes: 1.008
|
Para empezar ese trigger salta después de la inserción por lo que aunque no sea válido el registro, ya estará insertado. Tiene que ser before.
Además no vale eso de producto.stock y ya. Cuando insertas un registro en Inventario, los campos que introduces son: id_pedido, id_producto, cantidad. Ninguno de ellos es stock. Así que lo que tienes que hacer es una consulta a la tabla Producto para obtener el registro asociado a ese id_producto.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
rubcr
Desconectado
Mensajes: 51
|
Para empezar ese trigger salta después de la inserción por lo que aunque no sea válido el registro, ya estará insertado. Tiene que ser before.
Además no vale eso de producto.stock y ya. Cuando insertas un registro en Inventario, los campos que introduces son: id_pedido, id_producto, cantidad. Ninguno de ellos es stock. Así que lo que tienes que hacer es una consulta a la tabla Producto para obtener el registro asociado a ese id_producto.
Llevo varias horas intentando añadir lo que me indicas pero me has terminado de descolocar. Xddddd Como hago una consulta a una tabla entera?
En este caso puedes crear un trigger BEFORE INSERT que compruebe lo que tú dices y en caso de que no sea válido puedes ejecutar: SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Insercion no valida...'
Te dejo un link para que leas más acerca de ello: https://dev.mysql.com/doc/refman/8.0/en/signal.htmlDe la misma forma que antes. En vez de insertar el producto y después de la inserción, comprobar la validez del mismo; puedes usar un trigger BEFORE INSERT y lanzar otro error si no se cumple la condición de validez del registro. Hola de nuevo, el segundo trigger no se puede hacer, basicamente cuando haces un Insert la tabla se queda bloqueada y no podrias hacer otra accion como un delete seguida. Y del primero no consigo hacer nada. MOD: No hacer doble post. Usa el boton modificar.
|
|
« Última modificación: 5 Junio 2020, 20:36 pm por MCKSys Argentina »
|
En línea
|
|
|
|
K-YreX
Desconectado
Mensajes: 1.008
|
Hola de nuevo, el segundo trigger no se puede hacer, basicamente cuando haces un Insert la tabla se queda bloqueada y no podrias hacer otra accion como un delete seguida. Y del primero no consigo hacer nada. Trigger para que no permita introducir en Inventario una cantidad mayor que la que tiene ese producto en la tabla Producto: DELIMITER // CREATE TRIGGER TR_Inventario BEFORE INSERT ON Inventario FOR EACH ROW BEGIN DECLARE producto_stock INT; SELECT producto.stock INTO producto_stock FROM producto WHERE producto.id_producto = NEW.id_producto; IF(producto_stock < NEW.cantidad) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: Inventario'; END IF; END// DELIMITER ;
Trigger que no permita introducir en la tabla Producto cantidades negativas: DELIMITER // CREATE TRIGGER TR_Producto BEFORE INSERT ON Producto FOR EACH ROW BEGIN IF(NEW.cantidad < 1) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: La cantidad tiene que ser mayor que 0'; END IF; END// DELIMITER ;
He probado ambos triggers en una base de datos de prueba y funcionan.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Solucionado] Pregunta Trigger MySql
Bases de Datos
|
raul_samp
|
0
|
2,598
|
27 Marzo 2012, 17:09 pm
por raul_samp
|
|
|
Duda con trigger en MySQL (after update y after insert)
Bases de Datos
|
WHK
|
1
|
5,753
|
4 Febrero 2014, 00:27 am
por Toxico
|
|
|
[CUAL ES EL ERROR] Crear variables en trigger MYSQL [RESUELTO]
Bases de Datos
|
LaThortilla (Effort)
|
3
|
4,385
|
20 Febrero 2015, 18:21 pm
por LaThortilla (Effort)
|
|
|
Trigger sencillo MySQL
« 1 2 »
Bases de Datos
|
Baal_30
|
12
|
7,889
|
1 Julio 2015, 19:25 pm
por Baal_30
|
|
|
Declaracion de variables en trigger mysql
Bases de Datos
|
d91
|
1
|
12,951
|
18 Enero 2017, 13:19 pm
por d91
|
|