elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Píldoras formativas en seguridad de la información


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  Trigger complejos MySQL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Trigger complejos MySQL  (Leído 918 veces)
rubcr

Desconectado Desconectado

Mensajes: 45


Ver Perfil
Trigger complejos MySQL
« en: 3 Junio 2020, 00:43 »

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:
Código
  1. CREATE TABLE Pedido(
  2.  id_pedido INT PRIMARY KEY,
  3.  fecha_ped DATE,
  4.  total FLOAT,
  5.  iva VARCHAR,
  6.  id_vendedor INT,
  7.  id_cliente INT,
  8. );
  9.  
  10. CREATE TABLE Producto(
  11.  id_producto INT PRIMARY KEY,
  12.  descripcion VARCHAR,
  13.  stock INT,
  14.  precio FLOAT,
  15.  estrellas INT(1)
  16. );
  17.  
  18. CREATE TABLE Inventario(
  19.  id_pedido INT,
  20.  id_producto INT,
  21.  cantidad INT DEFAULT 1,
  22.  PRIMARY KEY(id_pedido, id_producto),
  23.  CONSTRAINT FK_Inventario_Pedido FOREIGN KEY (id_pedido) REFERENCES Pedido(id_pedido),
  24.  CONSTRAINT FK_Inventario_Producto FOREIGN KEY (id_producto) REFERENCES Producto(id_producto)
  25. );
  26.  
  27.  
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 por rubcr » En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.823


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Trigger complejos MySQL
« Respuesta #1 en: 3 Junio 2020, 19:05 »

Hola!

Revisa este tutorial: https://www.mysqltutorial.org/mysql-triggers/mysql-after-insert-trigger/

Saludos!


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 Desconectado

Mensajes: 45


Ver Perfil
Re: Trigger complejos MySQL
« Respuesta #2 en: 3 Junio 2020, 19:35 »

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 Desconectado

Mensajes: 744



Ver Perfil
Re: Trigger complejos MySQL
« Respuesta #3 en: 4 Junio 2020, 11:33 »

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:
Código
  1. 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.html

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.
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

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
rubcr

Desconectado Desconectado

Mensajes: 45


Ver Perfil
Re: Trigger complejos MySQL
« Respuesta #4 en: 4 Junio 2020, 13:00 »

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:
Código
  1. 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.html
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.
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 Desconectado

Mensajes: 744



Ver Perfil
Re: Trigger complejos MySQL
« Respuesta #5 en: 4 Junio 2020, 15:16 »

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

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
rubcr

Desconectado Desconectado

Mensajes: 45


Ver Perfil
Re: Trigger complejos MySQL
« Respuesta #6 en: 4 Junio 2020, 16:40 »

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:
Código
  1. CREATE TRIGGER test_stock  
  2. AFTER INSERT ON inventario
  3. FOR EACH ROW BEGIN
  4.    IF (producto.stock < 0) THEN
  5.        SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning: No hay stock disponible!';
  6.    END IF;
  7. END$$
  8.  
  9. DELIMITER ;
  10.  
No me genera nada y no sé por qué está mal.
En línea

K-YreX


Desconectado Desconectado

Mensajes: 744



Ver Perfil
Re: Trigger complejos MySQL
« Respuesta #7 en: 4 Junio 2020, 19:23 »

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

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
rubcr

Desconectado Desconectado

Mensajes: 45


Ver Perfil
Re: Trigger complejos MySQL
« Respuesta #8 en: 5 Junio 2020, 02:29 »

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:
Código
  1. 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.html
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.
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 por MCKSys Argentina » En línea

K-YreX


Desconectado Desconectado

Mensajes: 744



Ver Perfil
Re: Trigger complejos MySQL
« Respuesta #9 en: 5 Junio 2020, 21:24 »

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:
Código
  1. DELIMITER //
  2. CREATE TRIGGER TR_Inventario BEFORE INSERT ON Inventario FOR EACH ROW BEGIN
  3.  DECLARE producto_stock INT;
  4.  SELECT producto.stock INTO producto_stock FROM producto WHERE producto.id_producto = NEW.id_producto;
  5.  IF(producto_stock < NEW.cantidad) THEN
  6.    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: Inventario';
  7.  END IF;
  8. END//
  9. DELIMITER ;

Trigger que no permita introducir en la tabla Producto cantidades negativas:
Código
  1. DELIMITER //
  2. CREATE TRIGGER TR_Producto BEFORE INSERT ON Producto FOR EACH ROW BEGIN
  3.  IF(NEW.cantidad < 1) THEN
  4.    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error: La cantidad tiene que ser mayor que 0';
  5.  END IF;
  6. END//
  7. DELIMITER ;

He probado ambos triggers en una base de datos de prueba y funcionan. :silbar: :silbar:
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado] Pregunta Trigger MySql
Bases de Datos
raul_samp 0 1,778 Último mensaje 27 Marzo 2012, 17:09
por raul_samp
Duda con trigger en MySQL (after update y after insert)
Bases de Datos
WHK 1 3,944 Último mensaje 4 Febrero 2014, 00:27
por Toxico
[CUAL ES EL ERROR] Crear variables en trigger MYSQL [RESUELTO]
Bases de Datos
LaThortilla (Effort) 3 2,359 Último mensaje 20 Febrero 2015, 18:21
por LaThortilla (Effort)
Trigger sencillo MySQL « 1 2 »
Bases de Datos
Baal_30 12 4,144 Último mensaje 1 Julio 2015, 19:25
por Baal_30
Declaracion de variables en trigger mysql
Bases de Datos
d91 1 6,159 Último mensaje 18 Enero 2017, 13:19
por d91
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines