Como se ha mencionado, cuando una función es llamada por el administrador de triggers (trigger manager), la estructura TriggerData *CurrentTriggerData no es NULL y se inicializa. Por lo cual es mejor verificar que CurrentTriggerData no sea NULL al principio y asignar el valor NULL justo después de obtener la información para evitar llamadas a la función trigger que no procedan del administrador de triggers.
La estructura TriggerData se define en src/include/commands/trigger.h:
typedef struct TriggerData
{
TriggerEvent tg_event;
Relation tg_relation;
HeapTuple tg_trigtuple;
HeapTuple tg_newtuple;
Trigger *tg_trigger;
} TriggerData; |
tg_event
describe los eventos para los que la función es llamada. Puede utilizar
las siguientes macros para examinar tg_event:
TRIGGER_FIRED_BEFORE(event) devuelve TRUE si el trigger se disparó antes;
TRIGGER_FIRED_AFTER(event) devuelve TRUE si se disparó después;
TRIGGER_FIRED_FOR_ROW(event) devuelve TRUE si el trigger se disparó para un
evento a nivel de fila;
TRIGGER_FIRED_FOR_STATEMENT(event) devuelve TRUE si el trigger se disparó
para un evento a nivel de sentencia.
TRIGGER_FIRED_BY_INSERT(event) devuelve TRUE si fue disparado por un INSERT;
TRIGGER_FIRED_BY_DELETE(event) devuelve TRUE si fue disparado por un DELETE;
TRIGGER_FIRED_BY_UPDATE(event) devuelve TRUE si fue disparado por un UPDATE.
tg_relation
es un puntero a una estructura que describe la relación disparadora. Mirar
en src/include/utils/rel.h para ver detalles sobre esta estructura. Lo más
interesante es tg_relation->rd_att (descriptor de las tuplas de la relación)
y tg_relation->rd_rel->relname (nombre de la relación. No es un char*, sino
NameData. Utilizar SPI_getrelname(tg_relation) para obtener char* si se
necesita una copia del nombre).
tg_trigtuple
es un puntero a la tupla por la que es disparado el trigger, esto es, la
tupla que se está insertando (en un INSERT), borrando (DELETE) o
actualizando (UPDATE).
En caso de un INSERT/DELETE esto es lo que se debe devolver al Ejecutor si
no se desea reemplazar la tupla con otra (INSERT) o ignorar la operación.
tg_newtuple
es un puntero a la nueva tupla en caso de UPDATE y NULL si es para un INSERT
o un DELETE. Esto es lo que debe devolverse al Ejecutor en el caso de un
UPDATE si no se desea reemplazar la tupla por otra o ignorar la operación.
tg_trigger
es un puntero a la estructura Trigger definida en src/include/utils/rel.h:
typedef struct Trigger
{
Oid tgoid;
char *tgname;
Oid tgfoid;
FmgrInfo tgfunc;
int16 tgtype;
bool tgenabled;
bool tgisconstraint;
bool tgdeferrable;
bool tginitdeferred;
int16 tgnargs;
int16 tgattr[FUNC_MAX_ARGS];
char **tgargs;
} Trigger;
tgname es el nombre del trigger, tgnargs es el número de argumentos en
tgargs,
tgargs es un array de punteros a los argumentos especificados en el CREATE
TRIGGER. Otros miembros son exclusivamente para uso interno. |