Disparador

Iniciado por Cuasar, 8 Agosto 2020, 03:57 AM

0 Miembros y 1 Visitante están viendo este tema.

Cuasar

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.



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.



Carloswaldo

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

WHK

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í:

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:

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.