Documentation PostgreSQL 8.3.23 > Programmation serveur > PL/Perl - Langage de procédures Perl > Déclencheurs PL/Perl
PrécédentNiveaux de confiance de PL/Perl Limitations et fonctionnalités absentes

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

AltStyle によって変換されたページ (->オリジナル) /