Cargando

Triggers en InterBase

Por Alfonso Ricaño Bringas
Los triggers es una de las características más interesantes y prácticas con que cuenta InterBase para garantizar la integridad de los datos, y la inserción de algunas reglas de negocio del sistema en la base de datos.

Los triggers permiten -como su nombre lo indica-, "disparar" (ejecutar) procedimientos cada vez que se realice una acción sobre los datos de una tabla. Esta acción puede consistir en la inserción, modificación o eliminación de un registro. De esta manera, podemos indicar, que se ejecuten acciones sobre los datos de la tabla, o de otras tablas cada vez que se modifican/agregan/eliminan datos de una tabla. Algunos usos de los triggers son: * Generar un valor consecutivo en un campo, utilizando un generador * Guardar un registro histórico de los valores que va teniendo uno o más campos de una tabla * Actualizar totales de la suma de campos de una tabla en otra Y muchos más usos. Su uso es muy sencillo, y las estructuras de control que utiliza son las mismas que se usan en los procedimientos almacenados, con estas diferencias: 1. Los triggers no tienen parámetros de entrada. Los únicos valores de entrada con los que puede trabajar son los valores del registro que se insertó/modificó/eliminó. 2. Los triggers no devuelven valores como los procedimientos almacenados. Sólo pueden modificar otras tablas o los mismos valores del registro agregado/modificado (obviamente, el eliminado no). Tipos de Triggers Una vez hechas estas aclaraciones, veamos los tipos de triggers que podemos crear. Como mencioné, los hay de tres tipos, dependiendo de la acción sobre la cual queremos que actúen: * Al insertar un registro * Al modificar un registro * Al eliminar un registro Ahora, tambien contamos con dos subtipos de triggers para cada tipo: antes y después de la acción. De esta manera contamos con seis distintos triggers que podemos utilizar: 1. Antes de Insertar 2. Después de Insertar 3. Antes de modificar 4. Después de modificar 5. Antes de eliminar 6. Después de eliminar Manejo de los valores del registro Como vemos, un trigger se activa cada vez que se ejecuta la acción a la que pertenece (insertar/modificar/eliminar). Ahora necesitamos saber como acceder a los valores del registro que recibió la acción. Esto se hace mediante los prefijos OLD. y NEW. antes del nombre del campo. Más adelante mostraré algunos detalles del uso de los prefijos, y en qué casos se pueden o no utilizar cada uno de ellos. Sintáxis Bueno, pues vayamos al grano. Para crear un trigger en una tabla deberemos utilizar la siguiente sintáxis: CREATE TRIGGER 'nombre_trigger' FOR 'tabla' {BEFORE | AFTER} {INSERT | UPDATE | DELETE} [POSITION numero] AS [DECLARE VARIABLE variable] BEGIN 'cuerpo del trigger' END Donde: 'nombre_trigger' es el nombre que le daremos al trigger y puede ser cualquier nombre. Para organizar mejor los triggers, yo prefiero nombrar al trigger con el nombre de la tabla, y luego una abreviación del tipo del trigger, por ejemplo BI es un trigger del tipo antes de insertar (Before Insert). 'tabla' Es la tabla a la cual se le creará el trigger. Obviamente, la tabla debe de existir. Después del nombre de la tabla se pone el tipo del trigger, por ejemplo, un trigger para después de actualizar deberá indicarse como AFTER UPDATE. POSITION indica el orden de ejecución del trigger dentro de los triggers de su tipo. Esto es porque pueden existir varios triggers de un mismo tipo, entonces si hay 4 triggers del tipo AFTER INSERT, el número indicado en POSITION indicará el orden en que se ejecutarán. Esta parte puede omitirse. En la parte entre AS y BEGIN se declaran todas las variables internas del trigger, de la misma manera que se hace en los procedimientos almacenados. En el 'cuerpo del trigger' se ponen las instrucciones que se ejecutarán en el trigger, de igual manera que en los procedimientos almacenados, obviamente no regresa valores, por lo que no es válido colocar una orden SUSPEND. Para ilustrar mejor esto, crearé un trigger para la tabla PERSONAS definida en el artículo número 2 de "Pasando de Paradox a InterBase". Esta tabla tiene la siguiente estructura: CREATE TABLE PERSONAS( CLAVEPERSONA INTEGER NOT NULL, NOMBRE VARCHAR(40), APELLIDOS VARCHAR(40), TELEFONO VARCHAR(40), EMAIL VARCHAR(100), PRIMARY KEY(CLAVEPERSONA) ) Vamos a crear un trigger que asigne automáticamente un valor a la columna CLAVEPERSONA, que es de tipo entero. Esto se hace fácilmente utilizando un Generador. Primero creamos el generador con este código: CREATE GENERATOR G_CLAVEPERSONA Una vez creado el generador, podemos crear el trigger, ya que hará uso de él. Para crear el trigger ejecutamos el siguiente código: CREATE TRIGGER PERSONAS_BI FOR PERSONAS BEFORE INSERT AS BEGIN NEW.CLAVEPERSONA=GEN_ID(G_CLAVEPERSONA,1); END ?Y listo! Cada vez que insertemos un nuevo registro en nuestra tabla PERSONAS, se ejecutará este código. Como vemos, fue declarado como BEFORE INSERT, para que pudiéramos modificar los valores de los campos (en este caso, se modifica el valor del campo CLAVEPERSONA, asignándole el valor obtenido del generador). La función GEN_ID nos da el valor del generador especificado como primer parámetro, y con un incremento especificado en el segundo parámetro (1 en este caso). Se deben tener las siguientes consideraciones para usar los prefijos NEW. y OLD. : * Si es un trigger de tipo INSERT, entonces para acceder a los campos se debe utilizar el prefijo NEW. * Si es un trigger de tipo UPDATE, entonces NEW nos dará el nuevo valor del campo (en caso de que haya sido modificado) y OLD nos dará el valor del campo antes de la modificación. * Si es un trigger de tipo DELETE, se debe utilizar únicamente el prefijo OLD. * Solamente se pueden modificar los valores de los campos en triggers de tipo BEFORE, obviamente solo BEFORE INSERT y BEFORE UPDATE. * Se recomienda que si se van a modificar valores de otras tablas, se hagan en triggers de tipo AFTER. Bueno, hasta aquí con este artículo. En una próxima entrega hablaré de cómo crear un trigger donde se puedan llevar las modificaciones de una tabla. 29-Enero-2001