Ver Mensaje Individual
  #4  
Antiguo 21-03-2014
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Reputación: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
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
Responder Con Cita