PL/Perl peut être utilisé pour écrire des fonctions pour déclencheurs. Dans une fonction déclencheur, la référence hachée $_TD contient des informations sur l'événement du déclencheur en cours. $_TD est une variable globale qui obtient une valeur locale séparée à chaque appel du déclencheur. Les champs de la référence de hachage $_TD sont :
Valeur NEW de la colonne foo
Valeur OLD de la colonne foo
Nom du déclencheur appelé
Événement du déclencheur : INSERT, UPDATE, DELETE ou UNKNOWN
Quand le déclencheur a été appelé : BEFORE (avant), AFTER (après) ou UNKNOWN (inconnu)
Le niveau du déclencheur : ROW (ligne), STATEMENT (instruction) ou UNKNOWN (inconnu)
L'OID de la table sur lequel le déclencheur a été exécuté
Nom de la table sur lequel le déclencheur a été exécuté
Nom de la table sur lequel le déclencheur a été exécuté. Elle est obsolète et pourrait être supprimée dans une prochaine version. Utilisez $_TD->{table_name} à la place.
Nom du schéma sur lequel le déclencheur a été exécuté.
Nombre d'arguments de la fonction déclencheur
Arguments de la fonction déclencheur. N'existe pas si $_TD->{argc} vaut 0.
Les déclencheurs peuvent renvoyer un des éléments suivants :
Exécute l'instruction
N'exécute pas l'instruction
Indique que la ligne NEW a été modifiée par la fonction déclencheur
Voici un exemple d'une fonction déclencheur 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 PROCEDURE valid_id();