Interacción con el Trigger Manager

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.