Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Limitar el número de registros a guardar (https://www.clubdelphi.com/foros/showthread.php?t=92832)

MAXIUM 16-02-2018 03:36:30

Limitar el número de registros a guardar
 
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

Cita:

Empezado por MAXIUM (Mensaje 524574)
...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.
Cita:

Empezado por MAXIUM (Mensaje 524584)
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:
Código SQL [-]
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


La franja horaria es GMT +2. Ahora son las 01:04:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi