MySQL - Los triggers

   
Vista:

Los triggers

Publicado por REHome (2 intervenciones) el 09/07/2009 13:47:34
Hola:

Estoy aprendiendo los trigger, la verdad me cuesta manejarlo.

He creado una base de datos llamado [B]prueba01[/B]. Y dos tablas llamada [B]dispositivos[/B] y [B]datos[/B].

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

[B]dispositivos[/B]
[IMG]http://electronicapic.iespana.es/cs/tabla35.jpg[/IMG]

[B]datos[/B]
[IMG]http://electronicapic.iespana.es/cs/tabla34.jpg[/IMG]

Los códigos de creación de la tabla dispisitivos es:
[CODE]
--
-- Base de datos: `prueba01`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `dispositivos`
--

CREATE TABLE IF NOT EXISTS `dispositivos` (
`ID` int(11) NOT NULL,
`nombre` varchar(30) NOT NULL,
`estado` tinyint(3) unsigned NOT NULL DEFAULT '0',
`descripcion` varchar(200) NOT NULL,
PRIMARY KEY (`ID`),
FULLTEXT KEY `nombre` (`nombre`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Volcar la base de datos para la tabla `dispositivos`
--

INSERT INTO `dispositivos` (`ID`, `nombre`, `estado`, `descripcion`) VALUES
(1, 'RELE 1', 0, 'Motor 1'),
(2, 'RELE 2', 0, 'Motor 2'),
(3, 'RELE 3', 0, 'Alarma'),
(4, 'RELE 4', 0, 'WebCam');

[/CODE]

Tabla datos es:
[CODE]
--
-- Base de datos: `prueba01`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `datos`
--

CREATE TABLE IF NOT EXISTS `datos` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`RELE_1` tinyint(4) NOT NULL,
`RELE_2` tinyint(4) NOT NULL,
`RELE_3` tinyint(4) NOT NULL,
`RELE_4` tinyint(4) NOT NULL,
`FECHA_HORA` datetime NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci AUTO_INCREMENT=13 ;

--
-- Volcar la base de datos para la tabla `datos`
--

INSERT INTO `datos` (`ID`, `RELE_1`, `RELE_2`, `RELE_3`, `RELE_4`, `FECHA_HORA`) VALUES
(1, 0, 0, 0, 0, '2009-07-09 11:17:34'),
(2, 1, 0, 0, 0, '2009-07-09 11:17:35'),
(3, 0, 0, 0, 0, '2009-07-09 11:17:36'),
(4, 1, 0, 0, 0, '2009-07-09 11:17:36'),
(5, 0, 0, 0, 0, '2009-07-09 11:17:37'),
(6, 1, 0, 0, 0, '2009-07-09 11:17:37'),
(7, 1, 1, 0, 0, '2009-07-09 11:17:37'),
(8, 1, 1, 1, 0, '2009-07-09 11:17:38'),
(9, 1, 1, 1, 1, '2009-07-09 11:17:38'),
(10, 1, 1, 1, 0, '2009-07-09 11:17:39'),
(11, 1, 1, 0, 0, '2009-07-09 11:17:39'),
(12, 1, 0, 0, 0, '2009-07-09 11:17:39');

[/CODE]

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 [B]dispositivos[/B] se altera cualquier dato en el campo [I]estado[/I], se la tabla [B]datos[/B] como auditoría o minotore o logs.

Si modifico a uno el ID=1 del campo estado a 1 que antes estaba a 0.
[IMG]http://electronicapic.iespana.es/cs/tabla36.jpg[/IMG]
Se cambia a 1 como muestra en la siguiente imagen.
[IMG]http://electronicapic.iespana.es/cs/tabla37.jpg[/IMG]

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 [B]dispositivos[/B].

[IMG]http://electronicapic.iespana.es/cs/tabla38.jpg[/IMG]

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

[IMG]http://electronicapic.iespana.es/cs/tabla39.jpg[/IMG]

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.

[IMG]http://electronicapic.iespana.es/cs/tabla41.jpg[/IMG]

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

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.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
información
Otras secciones de LWP con contenido de MySQL
- Cursos de MySQL
- Temas de MySQL
- Chat de MySQL
información
Cursos y Temas de MySQL
- MySQL 5.1 Reference Manual
- MySQL Query Browser
- Integridad referencial en MySQL

RE:Los triggers

Publicado por Emiliano (98 intervenciones) el 09/07/2009 18:24:38
El trigger es un disparador que se ejecuta sobre una tabla despues o antes de inserta, borrar o actualizar un dato.
Aclaro que se ejecuta sobre tablas, o sea cada tabla puede tener su trigger.
Se utiliza para lo que vos necesitas ,ej: insertas un dato en una tabla y dependiendo los datos de esa tabla insertas/actualizas/borras los datos en otra tabla.
Algo que a mi me trajo doler de cabeza es que en un trigger no podes modificar los datos de la misma tabla, siempre sobre otras tablas existentes.
El codigo para crear el trigger es:

---------------------------------------------------------------------------------------------------------
DELIMITER |

CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END
|

DELIMITER ;
------------------------------------------------------------------------------------------------------------
'testref' es el nombre del trigger
'test1' es el nombre sobre la cual actua el trigger
El operador NEW contiene todas las columnas sobre la cual se modificaron los datos.
En este ejemplo la fila
INSERT INTO test2 SET a2 = NEW.a1;
Antes de insertar el valor en la tabla test1, hace un insert en la tabla test2 (el valor que va a insertar de la tabla test1 lo saca con el operador NEW.a1, a1 es el nombre de la columna de la tabla test1)

tambien dentro del trigger podes tenes un if

DELIMITER |

CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
IF NEW.a1 = 1THEN
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
ENDIF;

END
|
DELIMITER ;

Que es segun creo lo que tu necesitas obviamente modificandolo a tus tablas.
Adentre puedes tener todos los IF que quieras

En esta pagina te explica todo bien
http://dev.mysql.com/doc/refman/5.0/es/create-trigger.html

Suerte espero que te sirva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Los triggers

Publicado por REHome (2 intervenciones) el 09/07/2009 18:48:21
Gracias, voy a comprobar.

Por si no lo he dejado claro. En la tabla "dispositivos" que detecte cualquier modificación en el campo 'estado' se activa el trigger (que me imagino que irá en la tabla "dispositivos"). Si te fijas hay 4 filas.

Ahora, en la tabla "datos" se debe guardar los 0 ó 1 correspondiente de cada campo 'estado' de la tabla "dispositivos".

En resumen:
Los datos de la tabla "dispositivos" del campo 'estado' si son modificados. Los guardas en Log o auditoría en la tabla "datos" de los campos 'RELE_1' al 'RELE_4' .

Es lo que quiero hacer. Voy a ver si me sale al final.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar