Esta sección describe los detalles de bajo nivel de la interfaz para una función de disparador de eventos. Esta información solo se necesita al escribir funciones de disparadores de eventos en C. Si estás utilizando un lenguaje de nivel superior, estos detalles se manejan por ti. En la mayoría de los casos, deberías considerar el uso de un lenguaje procedimental antes de escribir tus disparadores de eventos en C. La documentación de cada lenguaje procedimental explica cómo escribir un disparador de eventos en ese lenguaje.
Las funciones de disparadores de eventos deben utilizar la interfaz del gestor de funciones de la «versión 1».
Cuando el gestor de disparadores de eventos llama a una función, no se le pasan
argumentos normales, sino que se le pasa un puntero de «contexto» que
apunta a una estructura EventTriggerData. Las funciones en C pueden
comprobar si fueron llamadas desde el gestor de disparadores de eventos o no
ejecutando la macro:
CALLED_AS_EVENT_TRIGGER(fcinfo)
que se expande a:
((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))
Si esto devuelve verdadero, entonces es seguro convertir
fcinfo->context al tipo EventTriggerData
* y hacer uso de la estructura
EventTriggerData apuntada. La función
no debe alterar la estructura EventTriggerData
ni ninguno de los datos a los que apunta.
La estructura struct EventTriggerData está definida en
commands/event_trigger.h:
typedef struct EventTriggerData
{
NodeTag type;
const char *event; /* nombre del evento */
Node *parsetree; /* árbol de análisis */
CommandTag tag; /* etiqueta de comando */
} EventTriggerData;
donde los miembros se definen de la siguiente manera:
type
Siempre T_EventTriggerData.
event
Describe el evento para el cual se llama a la función, uno de
"login", "ddl_command_start",
"ddl_command_end", "sql_drop",
"table_rewrite".
Consulta la Section 38.1 para conocer el significado de estos
eventos.
parsetreeUn puntero al árbol de análisis del comando. Consulta el código fuente de PostgreSQL para obtener detalles. La estructura del árbol de análisis está sujeta a cambios sin previo aviso.
tag
La etiqueta de comando asociada con el evento para el cual se ejecuta el disparador
de eventos, por ejemplo "CREATE FUNCTION".
Una función de disparador de eventos debe devolver un puntero NULL
(no un valor nulo de SQL, es decir, no
establezcas isNull en verdadero).