39.6. Déclencheurs PL/Perl
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 :
-
$_TD->{new}{foo}
-
Valeur NEW de la colonne foo
-
$_TD->{old}{foo}
-
Valeur OLD de la colonne foo
-
$_TD->{name}
-
Nom du déclencheur appelé
-
$_TD->{event}
-
Événement du déclencheur : INSERT,
UPDATE, DELETE ou UNKNOWN
-
$_TD->{when}
-
Quand le déclencheur a été appelé : BEFORE (avant), AFTER
(après) ou UNKNOWN (inconnu)
-
$_TD->{level}
-
Le niveau du déclencheur : ROW
(ligne), STATEMENT (instruction) ou
UNKNOWN (inconnu)
-
$_TD->{relid}
-
L'OID de la table sur lequel le déclencheur a été exécuté
-
$_TD->{table_name}
-
Nom de la table sur lequel le déclencheur a été exécuté
-
$_TD->{relname}
-
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.
-
$_TD->{table_schema}
-
Nom du schéma sur lequel le déclencheur a été exécuté.
-
$_TD->{argc}
-
Nombre d'arguments de la fonction déclencheur
-
@{$_TD->{args}}
-
Arguments de la fonction déclencheur. N'existe pas si
$_TD->{argc} vaut 0.
Les déclencheurs peuvent renvoyer un des éléments suivants :
-
return;
-
Exécute l'instruction
-
"SKIP"
-
N'exécute pas l'instruction
-
"MODIFY"
-
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();