Como ya hemos visto en este artículo:

https://firebird21.wordpress.com/2013/05/24/registrando-los-cambios-realizados-a-los-datos-de-una-tabla/

a veces es muy conveniente registrar todas las actualizaciones realizadas a una tabla. Eso nos permitirá más adelante responder muchas preguntas relacionadas con: ¿quién lo hizo? ¿cuándo lo hizo? ¿qué hizo?

ACTUALIZACIONES3

(haciendo clic en la imagen la verás más grande)

Aquí, tenemos una tabla llamada COTIZACIONES que se utiliza para guardar las cotizaciones del dolar, tipo comprador y tipo vendedor. En el ejemplo del artículo de arriba la columna que se actualizaba era de tipo carácter, por lo tanto no había complicaciones, sin embargo ahora queremos actualizar una columna de tipo fecha y dos columnas de tipo numérico, entonces ¿cómo se grabaría en este caso?

SET TERM ^ ;

CREATE TRIGGER BIUD_COTIZACIONES_COT_IDENTI FOR COTIZACIONES
   ACTIVE BEFORE INSERT OR UPDATE OR DELETE
   POSITION 0
AS
   DECLARE VARIABLE lcUsuari TYPE OF D_NOMBRE30 COLLATE ISO8859_1;
   DECLARE VARIABLE ldTiempo TYPE OF D_FECHAHORA;
   DECLARE VARIABLE lcTablax TYPE OF D_NOMBRE30 COLLATE ISO8859_1;
   DECLARE VARIABLE lcOperac TYPE OF D_CHAR1 COLLATE ISO8859_1;
   DECLARE VARIABLE lnIdeTab TYPE OF D_IDENTIFICADOR;
   DECLARE VARIABLE lcColumn TYPE OF D_NOMBRE10 COLLATE ISO8859_1;
   DECLARE VARIABLE lcValorx TYPE OF D_NOMBRE254 COLLATE ISO8859_1;
BEGIN

   lcUsuari = CURRENT_USER;
   ldTiempo = CURRENT_TIMESTAMP;
   lcTablax = 'COTIZACIONES';

   IF (NEW.COT_IDENTI IS NULL OR NEW.COT_IDENTI = 0) THEN
      NEW.COT_IDENTI = GEN_ID(COTIZACIONES_COT_IDENTI_GEN, 1);

   IF (INSERTING) THEN BEGIN
      lcOperac = 'I';
      lnIdeTab = NEW.COT_IDENTI;
      lcColumn = 'COT_FECHAX';
      lcValorx = CAST(NEW.COT_FECHAX AS VARCHAR(10));
      INSERT INTO ACTUALIZACIONES
           VALUES(0, :lcUsuari, :ldTiempo, :lcTablax, :lcOperac, :lnIdeTab, :lcColumn, :lcValorx);
      lcColumn = 'COT_DOLCOM';
      lcValorx = CAST(NEW.COT_DOLCOM AS VARCHAR(12));
      INSERT INTO ACTUALIZACIONES
           VALUES(0, :lcUsuari, :ldTiempo, :lcTablax, :lcOperac, :lnIdeTab, :lcColumn, :lcValorx);
      lcColumn = 'COT_DOLVEN';
      lcValorx = CAST(NEW.COT_DOLVEN AS VARCHAR(12));
      INSERT INTO ACTUALIZACIONES
           VALUES(0, :lcUsuari, :ldTiempo, :lcTablax, :lcOperac, :lnIdeTab, :lcColumn, :lcValorx);
   END

END^

Para no hacerlo muy largo, solamente se muestra el código que corresponde a una inserción. O sea, cuando el usuario hace un INSERT. Podemos observar dos cosas:

  1. Se utilizó el mismo trigger que agrega un nuevo identificador a la tabla. Esto para no estar escribiendo demasiados triggers, pero ya es cuestión de gustos de cada uno usar un solo trigger o más de un trigger.
  2. Como las columnas que se guardan en la tabla ACTUALIZACIONES son de tipo fecha y de tipo numérico entonces se ejecutó la función CAST() para convertir los valores de esas columnas a tipo carácter.

En la imagen de abajo vemos el contenido de la tabla ACTUALIZACIONES luego de insertarle una nueva fila a la tabla COTIZACIONES, con FechaCotización = 24/05/2013, Dolar Compra = 4.050,50 y Dolar Venta = 4.120,30

ACTUALIZACIONES4

(haciendo clic en la imagen la verás más grande)

Como puedes ver, se puede saber muy bien quien lo hizo, cuando lo hizo y que hizo.