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. |