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

Auditoría MySQL

Estas en el tema de Auditoría MySQL en el foro de Mysql en Foros del Web. Estoy usando el MySQL 5.1.34. He creado una base de datos y tablas como muestra el código abajo. Código: -- phpMyAdmin SQL Dump -- version ...
  #1 (permalink)  
Antiguo 03/07/2009, 13:51
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 11 meses
Puntos: 8
Auditoría MySQL

Estoy usando el MySQL 5.1.34. He creado una base de datos y tablas como muestra el código abajo.

Código:
-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 03-07-2009 a las 20:43:33
-- Versión del servidor: 5.1.34
-- Versión de PHP: 5.2.10

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- 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=3 ;

--
-- 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, 1, 0, 1, 0, '2009-07-03 15:01:37'),
(2, 1, 0, 1, 1, '2009-07-03 15:21:48');

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

--
-- 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');

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

--
-- Estructura de tabla para la tabla `tabla01`
--

CREATE TABLE IF NOT EXISTS `tabla01` (
  `RELE_1` tinyint(1) DEFAULT NULL,
  `RELE_2` tinyint(1) DEFAULT NULL,
  `RELE_3` tinyint(1) DEFAULT NULL,
  `RELE_4` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;

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

INSERT INTO `tabla01` (`RELE_1`, `RELE_2`, `RELE_3`, `RELE_4`) VALUES
(1, 1, 0, 0);



Quiero aplicar este código en phpmyadmin o cual sea, este código que me da error.

Código:
CREATE TRIGGER datos AFTER UPDATE ON dispositivos 
   FOR EACH ROW
   BEGIN
   INSERT INTO datos(nombre, estado, descripcion)
   VALUES (NEW.rele_1, NEW.rele_2, NEW.rele_3, NEW.rele_4, NOW() );
   END;
Concretamente me da error en esta línea.
Código:
   VALUES (NEW.rele_1, NEW.rele_2, NEW.rele_3, NEW.rele_4, NOW() );
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #2 (permalink)  
Antiguo 03/07/2009, 14:53
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: Auditoría MySQL

Cita:
INSERT INTO datos(nombre, estado, descripcion)
Le estas diciendo que entre 3 valores y le estas enviando 5.
Cita:
VALUES (NEW.rele_1, NEW.rele_2, NEW.rele_3, NEW.rele_4, NOW() );
Debes corregir eso y de seguro te funciona.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 03/07/2009, 14:57
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 11 meses
Puntos: 8
Respuesta: Auditoría MySQL

Hola:

Lo he intentado mejorar:

Código:
CREATE TRIGGER trigger_datos AFTER UPDATE ON dispositivos
   FOR EACH ROW
   BEGIN
   INSERT INTO datos(ID, RELE_1, RELE_2, RELE_3, RELE_4, FECHA_HORA)
   VALUES (OLD.RELE_1, OLD.RELE_2, OLD.RELE_3, OLD.RELE_4, NOW() );
   END;
Me da fallo.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #4 (permalink)  
Antiguo 03/07/2009, 14:58
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: Auditoría MySQL

Estas haciendo lo mismo.
Le dices que reciba 6 parametros, y le envias unicamente 5.
Mandale el ID también en el values.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 03/07/2009, 15:54
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 11 meses
Puntos: 8
Respuesta: Auditoría MySQL

Es verdad:

Código:
CREATE TRIGGER trigger_datos AFTER UPDATE ON dispositivos
   FOR EACH ROW
   BEGIN
   INSERT INTO datos(RELE_1, RELE_2, RELE_3, RELE_4, FECHA_HORA)
   VALUES (OLD.RELE_1, OLD.RELE_2, OLD.RELE_3, OLD.RELE_4, NOW() );
   END;
Sigue con el mismo fallo.

Debe quedar reflejado estos valores si cambia cualquer valor 1 ó 0.

__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #6 (permalink)  
Antiguo 03/07/2009, 16:00
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: Auditoría MySQL

Cita:
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;
Si esta es tu tabla.. de donde salen los valores old.rel_1,old.rel_2,old.rel_3 y old.rel_4?

Recuerda que al utilizar las propiedades old y new, se hace referencia a los campos de la tabla en que se dispara el trigger, para este caso dispositivos.
Mira que la tabla datos, no tiene esos campos, sino nombre, estado descripcion etc.

Realmente... que necesitas hacer?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 03/07/2009, 16:08
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 11 meses
Puntos: 8
Respuesta: Auditoría MySQL

Menudo lío mental tengo conmigo mismo, aún así gracias por la ayuda.

En la imagen de abajo, donde pone estado, se puede modificar 0 ó 1. Cualquier estado de cualquier orden de los RELE_1 al 4 que en este caso es el 1,1,1,1.



En esta otra imagen justo abajo en la tabla llamada datos. Se vayan actualizando los datos de 0 y 1 junto con la fecha/hora. Olvida el campo COMENTARIOS.



Eso es lo que deseo hacer. Espero que esta vez me haya explciado mejor.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar
  #8 (permalink)  
Antiguo 03/07/2009, 16:30
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: Auditoría MySQL

La tabla dispositivos solo tendrá 4 registros?
Lo que tratas de hacer, no se puede hacer directamente y no tiene mucho sentiddo.
Le encontraría sentido (pero no estaria deacuerdo) si la tabla dispositivos solo tuviera 4 registros para siempre.

tendrías que insertar en la tabla el nombre tomado de un slect.

es así?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 03/07/2009, 16:40
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 11 meses
Puntos: 8
Respuesta: Auditoría MySQL

Tiene sentido, lo que no me he explicado bien.

Tengo un programa medio hecho con Visual C#.



En el campo estado donde pone 1, 0, 0, 0 se actualiza solo con 1 ó 0. En los botones de al lado lo hacen. Esta interfaz está conectada a MySQL. Ahora, lo que quiero es una auditoría sobre el cambio de esos estados binarios con su fecha/hora en el momento que cambia de estado.

También se puede hacer con sólo actualizarlo desde phpmyadmin.

Cita:

INSERT INTO `dispositivos` (`ID`, `nombre`, `estado`, `descripcion`) VALUES
(1, 'RELE 1', 1, 'Motor 1'),
(2, 'RELE 2', 0, 'Motor 2'),
(3, 'RELE 3', 1, 'Alarma'),
(4, 'RELE 4', 0, 'WebCam');
Hay un aexplicación aquí que funciona el ejemplo que usa, pero no consigo hacerlo de mi manera.

http://www.mysql-hispano.org/page.php?id=36&pag=1

Con cada estado se va agregando ID nueva, yn ejemplo es este de abajo:


Ignora el campo COMENTARIO, aunque lo veas en la imagen,en realidad lo he borrado.

En la fila ID=1, su estado del RELE_1 al RELE_4 es:

1,0,1,0

que al cambiar sólo el RELE_4 (que puede ser cualquiera), es decir, que como el actual es 0 lo actualizamos a 1 y su resultado es:

1,0,1,1

igual que la imagen de arriba para el ID=2.

Si ahora cambia cualquier estado, se crea un nuevo ID llamdo 3 y guarda los datos, incluido fecha/hora.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar

Última edición por REHome; 03/07/2009 a las 16:46
  #10 (permalink)  
Antiguo 03/07/2009, 17:27
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: Auditoría MySQL

El ejemplo es totalmente diferente.
Realiza el registro con los dos campos involucrados e inserta variables del sistema como current_user() y now() por eo funciona. ademas ñlo hace registro por registro y no como buscas hacerlo.. cada cuatro registros.

segun te entiendo... el primer insert, debe salvar un valor, el segundo va para el campo 2, el tercer insert va para el campo 3 y asi´sucesivamente.
El problema es que el trigger se dispara ante un cambio en dispositivos y no esperar 4 cambios para poder actualizar.

O no estoy entendiendo?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 03/07/2009, 17:37
 
Fecha de Ingreso: mayo-2007
Ubicación: PIC-16F84A
Mensajes: 727
Antigüedad: 16 años, 11 meses
Puntos: 8
Respuesta: Auditoría MySQL

Bueno, veo que lo estoy haciendo mal.

¿Es mejor tener la tabla principal algo similar a esta?





Me olvidé ponerle el ID al principio y fehca/hora al final, ejejje. Para luego guardar los estados en la tabla datos.

NOTA: En la imagen se llama tabla01, en realidad es dispositivos.

Código:
--
-- Base de datos: `prueba01`
--

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

--
-- Estructura de tabla para la tabla `tabla01`
--

CREATE TABLE IF NOT EXISTS `tabla01` (
  `RELE_1` tinyint(1) DEFAULT NULL,
  `RELE_2` tinyint(1) DEFAULT NULL,
  `RELE_3` tinyint(1) DEFAULT NULL,
  `RELE_4` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;

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

INSERT INTO `tabla01` (`RELE_1`, `RELE_2`, `RELE_3`, `RELE_4`) VALUES
(1, 1, 0, 0);
Mejor olvidar entonces el modelo:
Cita:
-- 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');
Mi fin es hacer auditoría si es posible. En caso de que sepas hacer mejores tablas que yo de principio a fin con triggers incluido, no te cortes en mostrarlos.
__________________
Meta Shell, VERSIÓN 1.2.2
Descargar

Última edición por REHome; 03/07/2009 a las 17:44
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 19:58.