Seguramente ya sabes lo que son los triggers y que hay triggers para las operaciones de INSERT, UPDATE y DELETE, pero ¿y si quieres también tener un trigger para un SELECT, puedes tenerlo?

Sí, con Firebird puedes.

Tendrás que trabajar un poco porque lo que harás será una simulación de un trigger, no un verdadero trigger, pero el efecto será exactamente el mismo.

En Firebird no existen los triggers para los SELECTs pero con mucha facilidad se puede simular uno.

La técnica es simplemente crear un stored procedure seleccionable y colocar en él todo lo que queremos.

Ejemplo. Crear un trigger para un SELECT de la tabla PRODUCTOS

Tenemos una tabla llamada PRODUCTOS que tiene la siguiente estructura:

TRIGGER1

Captura 1. Si haces clic en la imagen la verás más grande

y queremos guardar en una tabla llamada SELECTS todas las consultas que se realicen a esta tabla. La tabla SELECTS tiene esta estructura:

TRIGGER2

Captura 2. Si haces clic en la imagen la verás más grande

Desde luego que podríamos agregarle más columnas si nos interesa, como el IP de la computadora, o cualquier otro dato.

CREATE PROCEDURE TRIGGER_PRODUCTOS
RETURNS(
   PRD_CODSUC TYPE OF COLUMN PRODUCTOS.PRD_CODSUC,
   PRD_IDENTI TYPE OF COLUMN PRODUCTOS.PRD_IDENTI,
   PRD_CODIGO TYPE OF COLUMN PRODUCTOS.PRD_CODIGO COLLATE ISO8859_1,
   PRD_NOMBRE TYPE OF COLUMN PRODUCTOS.PRD_NOMBRE COLLATE ISO8859_1,
   PRD_PRECTO TYPE OF COLUMN PRODUCTOS.PRD_PRECTO,
   PRD_PREVTA TYPE OF COLUMN PRODUCTOS.PRD_PREVTA)
AS
BEGIN
   
   IN AUTONOMOUS TRANSACTION DO
      INSERT INTO SELECTS
                 (SEL_IDENTI, SEL_FUENTE, SEL_TABPRI, SEL_TIMEST, SEL_USUARI)
          VALUES (0 , 'SELECT * FROM PRODUCTOS', 'PRODUCTOS', CURRENT_TIMESTAMP, CURRENT_USER);
   
   FOR SELECT
      PRD_CODSUC,
      PRD_IDENTI,
      PRD_CODIGO,
      PRD_NOMBRE,
      PRD_PRECTO,
      PRD_PREVTA
   FROM
      PRODUCTOS
   INTO
      :PRD_CODSUC,
      :PRD_IDENTI,
      :PRD_CODIGO,
      :PRD_NOMBRE,
      :PRD_PRECTO,
      :PRD_PREVTA
   DO
      SUSPEND;

END;

Y aquí tenemos el stored procedure seleccionable que simula ser un trigger del comando SELECT. Entonces, cada vez que el usuario escriba el comando:

SELECT
   *
FROM
   TRIGGER_PRODUCTOS

Actualizará a la tabla SELECT, cuyo contenido podremos revisar:

TRIGGER3

Captura 3. Si haces clic en la imagen la verás más grande

Y desde luego que podríamos usar la misma técnica para simular triggers a otras tablas.

Conclusión:

A veces nos podría resultar útil conocer cuando se hizo un SELECT a una tabla, entonces para esos casos podríamos escribir un stored procedure seleccionable que nos provea de toda la información que podamos necesitar. O cuando se hace el SELECT a una tabla, insertar, actualizar o borrar datos de otra tabla, etc., eso ya dependerá de nuestra creatividad.

Artículos relacionados:

Entendiendo a los triggers

El índice del blog Firebird21