F.41. spi — Características y ejemplos de la Interfaz de Programación del Servidor (SPI) #

F.41.1. refint — Funciones para implementar integridad referencial
F.41.2. autoinc — Funciones para campos autoincrementales
F.41.3. insert_username — Funciones para rastrear quién cambió una tabla
F.41.4. moddatetime — Funciones para rastrear el momento de la última modificación

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.

F.41.1. refint — Funciones para implementar integridad referencial #

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.

F.41.2. autoinc — Funciones para campos autoincrementales #

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.

F.41.3. insert_username — Funciones para rastrear quién cambió una tabla #

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.

F.41.4. moddatetime — Funciones para rastrear el momento de la última modificación #

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.