• Lunes 29 de Abril de 2024, 02:14

Autor Tema:  Los Triggers  (Leído 2240 veces)

Meta

  • Miembro MUY activo
  • ***
  • Mensajes: 140
    • Ver Perfil
Los Triggers
« en: Jueves 9 de Julio de 2009, 13:10 »
0
Hola:

Estoy aprendiendo los trigger, la verdad me cuesta manejarlo.

He creado una base de datos llamado prueba01. Y dos tablas llamada dispositivos y datos.

Sospecho que tengo mal diseñado la tabla datos para que el trigger se pueda cumplir y necesito ayuda.

dispositivos


datos


Los códigos de creación de la tabla dispisitivos es:
Código: Text
  1.  
  2. --
  3. -- Base de datos: `prueba01`
  4. --
  5.  
  6. -- --------------------------------------------------------
  7.  
  8. --
  9. -- Estructura de tabla para la tabla `dispositivos`
  10. --
  11.  
  12. CREATE TABLE IF NOT EXISTS `dispositivos` (
  13.   `ID` int(11) NOT NULL,
  14.   `nombre` varchar(30) NOT NULL,
  15.   `estado` tinyint(3) unsigned NOT NULL DEFAULT '0',
  16.   `descripcion` varchar(200) NOT NULL,
  17.   PRIMARY KEY (`ID`),
  18.   FULLTEXT KEY `nombre` (`nombre`)
  19. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  20.  
  21. --
  22. -- Volcar la base de datos para la tabla `dispositivos`
  23. --
  24.  
  25. INSERT INTO `dispositivos` (`ID`, `nombre`, `estado`, `descripcion`) VALUES
  26. (1, 'RELE 1', 0, 'Motor 1'),
  27. (2, 'RELE 2', 0, 'Motor 2'),
  28. (3, 'RELE 3', 0, 'Alarma'),
  29. (4, 'RELE 4', 0, 'WebCam');
  30.  
  31.  
  32.  

Tabla datos es:
Código: Text
  1.  
  2. --
  3. -- Base de datos: `prueba01`
  4. --
  5.  
  6. -- --------------------------------------------------------
  7.  
  8. --
  9. -- Estructura de tabla para la tabla `datos`
  10. --
  11.  
  12. CREATE TABLE IF NOT EXISTS `datos` (
  13.   `ID` int(11) NOT NULL AUTO_INCREMENT,
  14.   `RELE_1` tinyint(4) NOT NULL,
  15.   `RELE_2` tinyint(4) NOT NULL,
  16.   `RELE_3` tinyint(4) NOT NULL,
  17.   `RELE_4` tinyint(4) NOT NULL,
  18.   `FECHA_HORA` datetime NOT NULL,
  19.   PRIMARY KEY (`ID`)
  20. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci AUTO_INCREMENT=13 ;
  21.  
  22. --
  23. -- Volcar la base de datos para la tabla `datos`
  24. --
  25.  
  26. INSERT INTO `datos` (`ID`, `RELE_1`, `RELE_2`, `RELE_3`, `RELE_4`, `FECHA_HORA`) VALUES
  27. (1, 0, 0, 0, 0, '2009-07-09 11:17:34'),
  28. (2, 1, 0, 0, 0, '2009-07-09 11:17:35'),
  29. (3, 0, 0, 0, 0, '2009-07-09 11:17:36'),
  30. (4, 1, 0, 0, 0, '2009-07-09 11:17:36'),
  31. (5, 0, 0, 0, 0, '2009-07-09 11:17:37'),
  32. (6, 1, 0, 0, 0, '2009-07-09 11:17:37'),
  33. (7, 1, 1, 0, 0, '2009-07-09 11:17:37'),
  34. (8, 1, 1, 1, 0, '2009-07-09 11:17:38'),
  35. (9, 1, 1, 1, 1, '2009-07-09 11:17:38'),
  36. (10, 1, 1, 1, 0, '2009-07-09 11:17:39'),
  37. (11, 1, 1, 0, 0, '2009-07-09 11:17:39'),
  38. (12, 1, 0, 0, 0, '2009-07-09 11:17:39');
  39.  
  40.  
  41.  


Sigo sospechando que hay que hacer diseñar mejor la tabla datos para que el trigger funcione. ¿En qué consiste estas tablas?

Consiste en que la tabla dispositivos se altera cualquier dato en el campo estado, se la tabla datos como auditoría o minotore o logs.

Si modifico a uno el ID=1 del campo estado a 1 que antes estaba a 0.

Se cambia a 1 como muestra en la siguiente imagen.


Desde ahí tiene que activarse el supuesto triggers que no se como se hace. El resultado es que el campo RELE_1 se activa a 1 como ocurrió en la tabla dispositivos.



Siguiendo con el ejemplo. Vamos a modificar el ID=3 del campo estado de la tabla dispositivos a 1. Quedaría como muestra abajo.



Ya que el supuesto trigger ha detectado un cambio en cualquier campo de RELE_1 al RELE_4, pues actualiza una nueva ID en la tabla datos que ahora se llama ID=2 y queda como muestra en la imagen siguiente.



Así seguirá la tabla datos creciendo mientras el trigger detecte cualquier modificación de la tabla dispositivos en el campo estado.

Espero haber explicado bien el tema. Que consiste en hacer un triggers ser capaz de lo que pido porque no se hacerlo. Cualquier duda que no entienda me avisa para explicarlo lo mejor posible para que lo entiendan.

Un cordial saludo.

lair

  • Miembro MUY activo
  • ***
  • Mensajes: 213
  • Nacionalidad: mx
    • Ver Perfil
Re: Los Triggers
« Respuesta #1 en: Miércoles 15 de Julio de 2009, 20:01 »
0
hola:

en primera los trigger se designan sobre tablas (completas) y no sobre campos.
la segunda, puedes publicar el codigo de tu trigger, asi podriamos ayudarte mejor

Meta

  • Miembro MUY activo
  • ***
  • Mensajes: 140
    • Ver Perfil
Re: Los Triggers
« Respuesta #2 en: Miércoles 15 de Julio de 2009, 21:52 »
0
Ya me ha salido.
Código: SQL
  1.  
  2. -- phpMyAdmin SQL Dump
  3. -- version 3.2.0.1
  4. -- http://www.phpmyadmin.net
  5. --
  6. -- Servidor: localhost
  7. -- Tiempo de generación: 15-07-2009 a las 20:52:13
  8. -- Versión del servidor: 5.1.36
  9. -- Versión de PHP: 5.2.10
  10.  
  11. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  12.  
  13. --
  14. -- Base de datos: `pic_remoto`
  15. --
  16. CREATE DATABASE `pic_remoto` DEFAULT CHARACTER SET latin1 COLLATE latin1_spanish_ci;
  17. USE `pic_remoto`;
  18.  
  19. -- --------------------------------------------------------
  20.  
  21. --
  22. -- Estructura de tabla para la tabla `dispositivos`
  23. --
  24.  
  25. CREATE TABLE IF NOT EXISTS `dispositivos` (
  26.   `ID` INT(11) NOT NULL AUTO_INCREMENT,
  27.   `nombre` VARCHAR(6) COLLATE latin1_spanish_ci NOT NULL,
  28.   `estado` tinyint(2) NOT NULL,
  29.   `descripcion` VARCHAR(20) COLLATE latin1_spanish_ci NOT NULL,
  30.   PRIMARY KEY (`ID`)
  31. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci AUTO_INCREMENT=5 ;
  32.  
  33. --
  34. -- (Evento) desencadenante `dispositivos`
  35. --
  36. DROP TRIGGER IF EXISTS `pic_remoto`.`logestado`;
  37. DELIMITER //
  38. CREATE TRIGGER `pic_remoto`.`logestado` AFTER UPDATE ON `pic_remoto`.`dispositivos`
  39.  FOR EACH ROW BEGIN
  40.  
  41.                                    DECLARE Rele1 INT;
  42.                                    DECLARE Rele2 INT;
  43.                                    DECLARE Rele3 INT;
  44.                                    DECLARE Rele4 INT;
  45.  
  46.                                    SET Rele1 = (SELECT estado
  47.                                    FROM dispositivos
  48.                                    WHERE nombre LIKE 'RELE 1');
  49.  
  50.                                    SET Rele2 = (SELECT estado
  51.                                    FROM dispositivos
  52.                                    WHERE nombre LIKE 'RELE 2');
  53.  
  54.                                    SET Rele3 = (SELECT estado
  55.                                    FROM dispositivos
  56.                                    WHERE nombre LIKE 'RELE 3');
  57.  
  58.                                    SET Rele4 = (SELECT estado
  59.                                    FROM dispositivos
  60.                                    WHERE nombre LIKE 'RELE 4');
  61.  
  62.                                    INSERT INTO log(RELE_1, RELE_2, RELE_3, RELE_4, USUARIO, FECHA_HORA)
  63.                                    VALUES (Rele1, Rele2, Rele3, Rele4, USER(), NOW());
  64.                              END
  65. //
  66. DELIMITER ;
  67.  
  68. --
  69. -- Volcar la base de datos para la tabla `dispositivos`
  70. --
  71.  
  72. INSERT INTO `dispositivos` (`ID`, `nombre`, `estado`, `descripcion`) VALUES
  73. (1, 'RELÉ 1', 0, 'descripcion1'),
  74. (2, 'RELÉ 2', 0, 'descripcion2'),
  75. (3, 'RELÉ 3', 0, 'descripcion3'),
  76. (4, 'RELÉ 4', 0, 'descripcion4');
  77.  
  78. -- --------------------------------------------------------
  79.  
  80. --
  81. -- Estructura de tabla para la tabla `log`
  82. --
  83.  
  84. CREATE TABLE IF NOT EXISTS `log` (
  85.   `ID` INT(11) NOT NULL AUTO_INCREMENT,
  86.   `RELE_1` tinyint(1) NOT NULL,
  87.   `RELE_2` tinyint(1) NOT NULL,
  88.   `RELE_3` tinyint(1) NOT NULL,
  89.   `RELE_4` tinyint(1) NOT NULL,
  90.   `USUARIO` VARCHAR(40) COLLATE latin1_spanish_ci NOT NULL,
  91.   `FECHA_HORA` datetime NOT NULL,
  92.   PRIMARY KEY (`ID`)
  93. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci AUTO_INCREMENT=9 ;
  94.  
  95. --
  96. -- Volcar la base de datos para la tabla `log`
  97. --
  98.  
  99.  
  100.  

Gracias.