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();