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