

   PL/Perl peut être utilisé pour écrire des fonctions pour triggers.
   Dans une fonction trigger, la référence hachée
   $_TD contient des informations sur l'événement du
   trigger en cours. $_TD est une variable globale
   qui obtient une valeur locale séparée à chaque appel du trigger.
   Les champs de la référence de hachage
   $_TD sont :
   
$_TD->{new}{foo}
       Valeur NEW de la colonne foo
      
$_TD->{old}{foo}
       Valeur OLD de la colonne foo
      
$_TD->{name}Nom du trigger appelé
$_TD->{event}
       Événement du trigger : INSERT,
       UPDATE, DELETE,
       TRUNCATE, INSTEAD OF ou
       UNKNOWN
      
$_TD->{when}
       Quand le trigger a été appelé :
       BEFORE (avant), AFTER
       (après) ou UNKNOWN (inconnu)
      
$_TD->{level}
       Le niveau du trigger : ROW (ligne),
       STATEMENT (instruction) ou
       UNKNOWN (inconnu)
      
$_TD->{relid}L'OID de la table sur lequel le trigger a été exécuté
$_TD->{table_name}Nom de la table sur lequel le trigger a été exécuté
$_TD->{relname}Nom de la table sur lequel le trigger a été exécuté. Elle est obsolète et pourrait être supprimée dans une prochaine version. Utilisez $_TD->{table_name} à la place.
$_TD->{table_schema}Nom du schéma sur lequel le trigger a été exécuté.
$_TD->{argc}Nombre d'arguments de la fonction trigger
@{$_TD->{args}}
       Arguments de la fonction trigger. N'existe pas si
       $_TD->{argc} vaut 0.
      
Les triggers niveau ligne peuvent renvoyer un des éléments suivants :
return;Exécute l'opération
"SKIP"N'exécute pas l'opération
"MODIFY"
       Indique que la ligne NEW a été modifiée par la
       fonction trigger
      
Voici un exemple d'une fonction trigger illustrant certains points ci-dessus :
CREATE TABLE test (
    i int,
    v varchar
);
CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$
    if (($_TD->{new}{i} >= 100) || ($_TD->{new}{i} <= 0)) {
        return "SKIP";    # passe la commande INSERT/UPDATE
    } elsif ($_TD->{new}{v} ne "immortal") {
        $_TD->{new}{v} .= "(modified by trigger)";
        return "MODIFY";  # modifie la ligne et exécute la commande INSERT/UPDATE
    } else {
        return;           # exécute la commande INSERT/UPDATE
    }
$$ LANGUAGE plperl;
CREATE TRIGGER test_valid_id_trig
    BEFORE INSERT OR UPDATE ON test
    FOR EACH ROW EXECUTE FUNCTION valid_id();