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:
RECORD
y que contiene el
registro nuevo en el caso de un trigger disparado con INSERT
o UPDATE
a nivel de renglones.
RECORD
y que contiene el
registro anterior en el caso de un trigger disparado con
DELETE
o UPDATE
a nivel de renglones.
name
que contiene el
nombre del trigger disparado.
text
que contiene la
cadena `BEFORE
' o la cadena `AFTER
' dependiendo de la
definición del trigger.
text
que contiene la
cadena `ROW
' o la cadena `STATEMENT
' dependiendo de la
definición del trigger.
text
que contiene alguna
de las cadenas `INSERT
', `UPDATE
' o `DELETE
'
indicando que operación disparó al trigger.
oid
que contiene
el OID
de la tabla que disparó el trigger.
name
que contiene el
nombre de la tabla que disparó el trigger.
integer
que contiene el
número de argumentos dados al trigger durante la creación del
mismo.
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.