Bueno aquí un pequeño aporte.
Los disparadores son un elemento importante entre las capacidades proporcionadas por
firebird para la implementación de las reglas de negocio centralizadas.
Un disparador se ejecuta cuando se realiza una solicitud que va a cambiar el estado de los datos en una tabla. Estos se ejecutan a nivel de registro y son parte de la trasacción que cambia el estado de un registro.
Los disparadores pueden ser ejecutados en 2 faces, y son aplicados a uno de los tres eventos:
Faces
- before (antes)
- after (después)
Eventos
- Inserting (inserción)
- Updating (actualización)
- Deleting (eliminación)
Por supuesto las faces y eventos se pueden combinar
Before Insert: Antes de insertar
After Insert: Después de insertar
Before Update: Antes de actualizar
After Update: Después de acualizar
Before Delete: Antes de eliminar
After Delete: Después de eliminar
Otro punto importante es que dentro de estos eventos se puede acceder a los valores de los campos del registro a traves de las variables
NEW y
OLD.
Las variables
NEW.* tienen valor en los eventos de
INSERT y
UPDATE,
OLD.* en los eventos
UPDATE y
DELETE
Hay que tener presente que NEW.* y OLD.* tienen valores nulos en los eventos DELETE y INSERT.
La pregunta que surge es para que usar estos variables NEW.* y OLD.*, bueno la respuesta es:
- Asignar valores iniciales validos bajo ciertas condiciones
- validar o transformar los datos ingresados
- Asignar claves y valores para actualizar otras tablas
- Asignar claves auto-incrementales.
Ejemplos reales:
BEFORE INSERT OR UPDATE:
Código SQL
[-]
CREATE OR ALTER TRIGGER AREAS_BI FOR AREAS
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
DECLARE VARIABLE EDADCLAVE SMALLINT; --Declaración de variables locales
BEGIN
--Verificar si el campo CLAVE es nulo
IF (NEW.ID_AREA IS NULL) THEN
NEW.ID_AREA = GEN_ID(GEN_AREAS_ID,1); --Asignar valor generado por GEN_ID
--Verificar si el campo es nulo y asignar fecha actual
IF (NEW.CREADA_ARE IS NULL) THEN
NEW.CREADA_ARE=CURRENT_DATE;
IF (NEW.MODIF_ARE IS NULL) THEN
NEW.MODIF_ARE=CURRENT_DATE;
-verificar si campo es nulo y asignar valor cero
IF (NEW.ORIGEN_ARE IS NULL) THEN
NEW.ORIGEN_ARE=0;
--Valida la Edad Clave.
IF ((NEW.EDADKEY IS NULL) OR (NEW.EDADKEY=0)) THEN
BEGIN
--Obtener un dato de otra tabla y asignarla al vampo NEW.EdadKey
SELECT EDADKEY
FROM SIMULADOR
WHERE SIMULADOR.ID_SIM=NEW.ID_SIM
INTO :EDADCLAVE;
NEW.EDADKEY=:EDADCLAVE;
END
END
AFTER UPDATE:
Código SQL
[-]
CREATE OR ALTER TRIGGER INFORMES_AU0 FOR INFORMES
ACTIVE AFTER UPDATE POSITION 0
AS
BEGIN
--Actualiza todos los informes de las áreas
--cuando se produce algun cambio en la definición
--de los informes del sistema
UPDATE AREAS_INFORMES
SET AREAS_INFORMES.EDADES_AIN=NEW.EDADES_INF,
AREAS_INFORMES.MARCADO_AIN=1,
AREAS_INFORMES.FILE_AIN=NEW.FILE_INF,
AREAS_INFORMES.VARIABLES=NEW.VARIABLES
WHERE AREAS_INFORMES.ID_INF=NEW.ID_INF;
END
Espero que sea de utilidad, Saludos cordiales