Documentation PostgreSQL 14.22 » Programmation serveur » Déclencheurs (triggers) sur événement » Écrire des fonctions trigger sur événement en C

Précédent | Niveau supérieur | Suivant
40.2. Matrice de déclenchement des triggers sur événement | Sommaire | 40.4. Un exemple complet de trigger sur événement

## 40.3. Écrire des fonctions trigger sur événement en C

Cette section décrit les détails bas niveau de l'interface pour une fonction trigger sur événement bas niveau. Ces informations sont seulement nécessaires si vous écrivez des fonctions triggers sur événement en C. Si vous utilisez un langage de plus haut niveau, ces détails sont gérés pour vous. Dans la plupart des cas, vous devriez songer sérieusement à utiliser un langage procédural avant d'écrire vos triggers sur événement en C. La documentation de chaque langage procédurale explique comment écrire un trigger sur événement dans ce langage.

Les fonctions de trigger sur événement doivent utiliser l'interface du gestionnaire de fonctions « version 1 ».

Quand une fonction est appelée par le gestionnaire de triggers sur événement, elle ne reçoit aucun argument normal mais un pointeur « context » lui est fourni. Il pointe vers une structure de type `EventTriggerData`. Les fonctions C peuvent vérifier si elles ont été appelées par le gestionnaire de triggers sur événement en exécutant la macro :

    CALLED_AS_EVENT_TRIGGER(fcinfo)

qui vaut en fait :

    ((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))

Si cela renvoie la valeur true, alors il est possible de convertir `fcinfo->context` vers le type `EventTriggerData *` et d'utiliser la structure pointée `EventTriggerData`. La fonction ne doit pas modifier la structure `EventTriggerData` ou toute donnée qu'elle fournit.

`struct EventTriggerData` est défini dans `commands/event_trigger.h` :

    typedef struct EventTriggerData
    {
        NodeTag     type;
        const char *event;      /* event name */
        Node       *parsetree;  /* parse tree */
        CommandTag  tag;        /* command tag */
    } EventTriggerData;

dont les membres sont définis ainsi :

`type`

  Always `T_EventTriggerData`.

`event`

  Décrit l'événement pour lequel la fonction a été appelée. Ce sera soit `"ddl_command_start"`, soit `"ddl_command_end"`, soit `"sql_drop"`, soit `"table_rewrite"`. Voir Section 40.1 pour la signification de ces événements.

`parsetree`

  Un pointeur vers l'arbre d'analyse de la commande. Vérifiez le code source de PostgreSQL pour les détails. La structure de l'arbre d'analyse est sujet à modification sans notification.

`tag`

  La balise de la commande associée avec l'événement pour lequel le trigger sur événement est exécuté, par exemple `"CREATE FUNCTION"`.

Une fonction trigger sur événement doit renvoyer un pointeur `NULL` (et pas une valeur SQL NULL, autrement dit ne pas configurer `isNull` à true).