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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


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

Desconectado Desconectado

Mensajes: 219



Ver Perfil
Disparador
« en: 8 Agosto 2020, 03:57 am »

Hola. Tengo una tabla llamada servers que contiene estos campos:
id, serverkey, servertag, checktime y estado.

un programa externo actualiza el campo checktime cada 30 segundos lo que me indica que el servidor esta en linea.

estoy intentando hacer un disparador (TRIGGER) que en cada actualización ponga el campo estado en 1.

Código:

CREATE TRIGGER `estado` BEFORE UPDATE ON `servers`
FOR EACH ROW

BEGIN
 set NEW.estado = 1;
END

el problema es que en la tabla tengo 9 registros y este disparador me actualiza el campo estado de todos los registros cuando se actualiza cualquiera de ellos.

Y me gustaría que se actualice solo el registro correspondiente.

Si alguien puede darme una mano estaré muy agradecido.




En línea

Carloswaldo
Traductor
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.741


Nos reservamos el derecho de ban.


Ver Perfil WWW
Re: Disparador
« Respuesta #1 en: 1 Octubre 2020, 22:25 pm »

Si puedes, muéstranos cómo se está haciendo el UPDATE.


En línea

WHK
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.342


The Hacktivism is not a crime


Ver Perfil WWW
Re: Disparador
« Respuesta #2 en: 2 Octubre 2020, 00:08 am »

Normalmente lo que debes hacer es tener un registro de última conexión, entonces, en ves de saber con numeros los que estan conectados debieras tener un registro de servidores junto a una columna que indique la fecha de última conexión, luego calculas si esa fecha tiene mas de 30 segundos de antiguedad.

Por ejemplo, cada servidor envía una solicitud a un servidor, el servidor toma la dirección ip de procedencia y actualiza la tabla de servidores, algo así:

Código:
UPDATE servers SET last_connection = NOW() WHERE address = %s;

según sea tu tipo de base de datos, tendrás que usar una función de SQL que obtenga el año, mes, dia, hora, minuto y segundo, algo como YYYY-MM-DD HH:MM:SS. La comparación de campos de tipo TIMESTAMP en Mysql o similares en otros motores, tienen la ventja de que puedes buscar por rangos o realizar calculos de tiempos directamente sobre la base de datos, entonces, para saber si un servidor está en linea o no haces una consulta similar a esta:

Código:
SELECT 1 FROM servers
WHERE address = %s AND
last_connection > DATE_SUB(NOW(), INTERVAL 30 second)

Entonces, la última conexión debe ser mayor al tiempo actual menos 30 segundos, o sea, retornará un 1 si el servidor tuvo una conexión hace menos de 30 segundos.

Para saber todos los servidores conectados reemplazas el 1 por la dirección ip o nombre del servidor y listo. No necesitas procedimientos almacenados o un cron para eso, de hecho no es buena práctica porque escapa de la lógica de tu capa de negocio o capa de datos, si pones tus procedimientos en la base de datos no podrás crear una aplicación escalable ni de uso transaccional.

Saludos.
En línea

Telegram: @WHK102 - Semáforo Epidemiologico Chile
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Neurocam te permite hacer fotografía usando tu mente de disparador
Noticias
wolfbcn 0 947 Último mensaje 31 Octubre 2013, 18:31 pm
por wolfbcn
Implementar un disparador en Postgresql
Bases de Datos
bettu 0 1,174 Último mensaje 18 Noviembre 2017, 13:47 pm
por bettu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines