El módulo spi proporciona varios ejemplos prácticos del uso de la Interfaz de Programación del Servidor (SPI) y de disparadores (triggers). Aunque estas funciones tienen cierto valor por sí mismas, son aún más útiles como ejemplos para modificar para tus propios fines. Las funciones son lo suficientemente generales como para ser utilizadas con cualquier tabla, pero debes especificar los nombres de las tablas y los campos (como se describe a continuación) al crear un disparador.
Cada uno de los grupos de funciones descritos a continuación se proporciona como una extensión instalable por separado.
check_primary_key() y
check_foreign_key() se utilizan para comprobar las restricciones de clave foránea.
(Esta funcionalidad ha sido superada desde hace mucho tiempo por el mecanismo de clave foránea
incorporado, por supuesto, pero el módulo sigue siendo útil como ejemplo).
check_primary_key() comprueba la tabla que hace la referencia.
Para usarla, crea un disparador AFTER INSERT OR UPDATE utilizando esta
función en una tabla que haga referencia a otra. Especifica como argumentos del disparador:
los nombres de las columnas de la tabla que hace la referencia que forman la clave foránea,
el nombre de la tabla referenciada y los nombres de las columnas en la tabla referenciada
que forman la clave primaria/única. Para manejar múltiples claves
foráneas, crea un disparador para cada referencia.
check_foreign_key() comprueba la tabla referenciada.
Para usarla, crea un disparador AFTER DELETE OR UPDATE utilizando esta
función en una tabla referenciada por otra(s) tabla(s). Especifica como argumentos del
disparador: el número de tablas que hacen la referencia para las cuales la función debe
realizar la comprobación, la acción si se encuentra una clave que hace referencia
(cascade — para eliminar la fila que hace la referencia,
restrict — para abortar la transacción si existen claves que
hacen referencia, setnull — para establecer a nulo los campos de la
clave que hace la referencia), los nombres de las columnas de la tabla disparada que
forman la clave primaria/única, luego el nombre de la tabla que hace la referencia y los
nombres de las columnas (repetido para tantas tablas que hacen la referencia como hayan sido
especificadas por el primer argumento). Ten en cuenta que las columnas de la clave
primaria/única deben estar marcadas como NOT NULL y deben tener un índice único.
Ten en cuenta que si estos disparadores se ejecutan desde
otro disparador BEFORE, pueden fallar inesperadamente. Por
ejemplo, si un usuario inserta la fila1 y luego el disparador BEFORE
inserta la fila2 y llama a un disparador con la función
check_foreign_key(),
la función check_foreign_key()
no verá la fila1 y fallará.
Hay ejemplos en refint.example.
autoinc() es un disparador que almacena el siguiente valor de
una secuencia en un campo entero. Esto se superpone un poco con la
característica incorporada de “columna serial”, pero no es lo mismo.
El disparador reemplazará el valor del campo solo si ese valor es
inicialmente cero o nulo (después de la acción de la sentencia SQL que
insertó o actualizó la fila). Además, si el siguiente valor de la
secuencia es cero, se llamará a nextval() por segunda vez
para obtener un valor distinto de cero.
Para usarlo, crea un disparador BEFORE INSERT (o opcionalmente BEFORE
INSERT OR UPDATE) utilizando esta función. Especifica dos
argumentos del disparador: el nombre de la columna entera que se va a modificar,
y el nombre del objeto de secuencia que suministrará los valores.
(De hecho, puedes especificar cualquier número de pares de dichos nombres si
deseas actualizar más de una columna autoincremental).
Hay un ejemplo en autoinc.example.
insert_username() es un disparador que almacena el nombre del
usuario actual en un campo de texto. Esto puede ser útil para rastrear
quién modificó por última vez una fila en particular dentro de una tabla.
Para usarlo, crea un disparador BEFORE INSERT y/o UPDATE
utilizando esta función. Especifica un único argumento del
disparador: el nombre de la columna de texto que se va a modificar.
Hay un ejemplo en insert_username.example.
moddatetime() es un disparador que almacena la hora
actual en un campo de tipo timestamp. Esto puede ser útil para rastrear
el momento de la última modificación de una fila en particular dentro de una tabla.
Para usarlo, crea un disparador BEFORE UPDATE
utilizando esta función. Especifica un único argumento del
disparador: el nombre de la columna que se va a modificar.
La columna debe ser de tipo timestamp o timestamp with
time zone.
Hay un ejemplo en moddatetime.example.