PDA

Ver la Versión Completa : Limitar el número de registros a guardar


MAXIUM
16-02-2018, 03:36:30
Hola, aquí les traigo mis problemas nuevamente :D

En esta ocasión, me gustaría poder guardar en una tabla un log que vaya realizando cada usuario. Por supuesto una base de datos esta prácticamente limitada por el espacio en disco duro. Aún así, me gustaría poder limitar la cantidad de registro a por ejemplo 2.000 y cuando alcance el tope, se elimine el más antiguo.

No se si esto sea posible. Si no lo es, no importa ^\||/

Lo que si me importa es que se guarde en la misma DB del servidor :p

Neftali [Germán.Estévez]
16-02-2018, 08:41:16
...me gustaría poder limitar la cantidad de registro a por ejemplo 2.000 y cuando alcance el tope, se elimine el más antiguo.

Seguramente, de todo el problema que plantesas, esa sea la parte más sencilla.
Debería bastar con un Stored Procedure (por ejemplo) que cada vez que lo llames haga un Count de la tabla y elimine los más antiguos.
Si usas un campo autoincremental, no te haría falta ni siquiera el Count, bastaría con eliminar aquellos cuyo ID es menor que el máximo menos 2000.
Y seguro que pensando un poco salen más formas de hacerlo.

Cuando llamar a este SP dependerá de cómo estés implementando ese Log para todo lo que hace el usuario, cosa que se me antoja que no es fácil (al menos si se intenta hacer bien).

Si das un poco más de información de cómo estás implementando ese LOG, tal vez podamos afinar más la respuesta.

MAXIUM
16-02-2018, 15:26:01
Gracias Neftali.

Básicamente registrar fecha-hora, registro que fue eliminado, editado o agregado y el usuario que lo realizó.

ecfisa
16-02-2018, 16:52:51
Hola.
Gracias Neftali.

Básicamente registrar fecha-hora, registro que fue eliminado, editado o agregado y el usuario que lo realizó.
Podes crear un archivo donde guardar toda la actividad que realiza un usuario sobre determinada tabla y al efecto crear un trigger que realize la tarea, por ejemplo:

SET TERM ^ ;

CREATE OR ALTER TRIGGER PERSONA_BI FOR PERSONA
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 0
AS
DECLARE VARIABLE V_ACTION VARCHAR(12);
DECLARE VARIABLE V_ID INTEGER;
DECLARE VARIABLE V_NOMBRE VARCHAR(40);
DECLARE VARIABLE V_DIRECC VARCHAR(40);
DECLARE VARIABLE V_LOCALID INTEGER;
DECLARE VARIABLE V_TELEF VARCHAR(15);
BEGIN

IF (INSERTING) THEN
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(G_PERSONA, 1);
V_ID = NEW.ID;
V_NOMBRE = NEW.NOMBRE;
V_DIRECC = NEW.DOMICILIO;
V_LOCALID = NEW.LOCALID;
V_TELEF = NEW.TELEFONO;
V_ACTION = 'INSERCION';
END
ELSE IF (UPDATING) THEN
BEGIN
V_ID = OLD.ID;
V_NOMBRE = NEW.NOMBRE;
V_DIRECC = NEW.DOMICILIO;
V_LOCALID = NEW.LOCALIDAD_ID;
V_TELEF = NEW.TELEFONO;
V_ACTION = 'MODIFICACION';
END
ELSE
BEGIN
V_ID = OLD.ID;
V_NOMBRE = OLD.NOMBRE;
V_DIRECC = OLD.DOMICILIO;
V_LOCALID = OLD.LOCALIDAD_ID;
V_TELEF = OLD.TELEFONO;
V_ACTION = 'BORRADO';
END


INSERT INTO PERSONA_HISTO (ID, PERSONAID, NOMBRE, DOMICILIO, LOCALIDADID,
TELEFONO, USER_NAME, DATETIME, REMOTE_ADDR, SESSION_ID, TYPE_ACTION)

VALUES (GEN_ID(G_PERSONA_HISTO, 1), :V_ID, :V_NOMBRE, :V_DIRECC, :V_LOCALID, :V_TELEF,
(SELECT CURRENT_USER FROM RDB$DATABASE),
(SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE),
(SELECT RDB$GET_CONTEXT('SYSTEM', 'CLIENT_ADDRESS') FROM RDB$DATABASE),
(SELECT RDB$GET_CONTEXT('SYSTEM', 'SESSION_ID') FROM RDB$DATABASE),
:V_ACTION);

END^

SET TERM ; ^

Donde PERSONA es la tabla a controlar y G_PERSONA su secuenciador. Mientras que PERSONA_HISTO sería la tabla de historial y G_PERSONA_HISTO su secuenciador.

Saludos :)

MAXIUM
16-02-2018, 17:51:23
Cómo siempre, la mejor comunidad :) Analizaré las propuestas. Gracias