next up previous contents index
Next: Manejo de excepciones Up: Curso de Bases de Previous: Ciclos.   Índice General   Índice de Materias

Triggers

Lo pescaron como al Trigger de Santa Julia...

Esto de los trigger es de lo más simpático. Resulta que uno puede ir y automatizar acciones que usualmente se ejecutan antes o después de una consulta, de tal manera que al llevar a cabo la consulta se ``dispare'' la ejecución de determinadas acciones, sin intervención humana.

Los trigger se pueden escribir en cualquiera de los siguientes lenguajes: C, PL/pgSQL y PL/Tcl. Sin embargo, examinando la tabla pg_language se puede observar que existe la referencia a Lisp:

mancha=> select * from pg_language;
lanname |lanispl|lanpltrusted|lanplcallfoid|lancompiler   
--------+-------+------------+-------------+--------------
internal|f      |f           |            0|n/a           
lisp    |f      |f           |            0|/usr/ucb/liszt
C       |f      |f           |            0|/bin/cc       
sql     |f      |f           |            0|postgres      
plpgsql |t      |t           |     10979662|PL/pgSQL      
(5 rows)

pero no existe documentación acerca de cómo se emplea.

Los triggers siempre deben de ser declarados como funciones sin argumentos y de tipo OPAQUE.

PostgreSQL tiene varias particularidades respecto a triggers que deben de ser tomadas en cuenta. La primera de ellas es la creación automática de ciertas variables que son visibles a la función:

NEW
Variable de tipo RECORD y que contiene el registro nuevo en el caso de un trigger disparado con INSERT o UPDATE a nivel de renglones.

OLD
Variable de tipo RECORD y que contiene el registro anterior en el caso de un trigger disparado con DELETE o UPDATE a nivel de renglones.

TG_NAME
Variable de tipo name que contiene el nombre del trigger disparado.

TG_WHEN
Variable de tipo text que contiene la cadena `BEFORE' o la cadena `AFTER' dependiendo de la definición del trigger.

TG_LEVEL
Variable de tipo text que contiene la cadena `ROW' o la cadena `STATEMENT' dependiendo de la definición del trigger.

TG_OP
Variable de tipo text que contiene alguna de las cadenas `INSERT', `UPDATE' o `DELETE' indicando que operación disparó al trigger.

TG_RELID
Variable de tipo oid que contiene el OID de la tabla que disparó el trigger.

TG_RELNAME
Variable de tipo name que contiene el nombre de la tabla que disparó el trigger.

TG_NARGS
Variable de tipo integer que contiene el número de argumentos dados al trigger durante la creación del mismo.

TG_ARGV[]
Variable de tipo arreglo de text que contiene los argumentos dados al momento de crear el trigger. El índice comienza en cero y puede ser indicado como una expresión. Índices no válidos ( 94#94) regresan NULL. Este es el único mecanismo para pasar argumentos a un trigger, ya que como se recordará la función activada no puede tener argumentos.

En segundo lugar, deben de regresar o NULL o un registro o renglón conteniendo exactamente la misma estructura de la tabla con la que fué disparado el trigger. Los triggers disparados por una acción AFTER siempre deberán de regresar el valor NULL sin ningún efecto. Los triggers disparados por una acción BEFORE sólo deberán de regresar el valor NULL cuando se deba de invalidar la acción para el renglón que lo dispara. De otra manera, el renglón o registro regresado reemplaza al insertado o actualizado por la operación. Es posible reemplazar valores en particular directamente en NEW y regresar éste o construir un renglón o registro completamente nuevo que suplante al original.



Subsecciones
next up previous contents index
Next: Manejo de excepciones Up: Curso de Bases de Previous: Ciclos.   Índice General   Índice de Materias
Ismael Olea 2001-04-21