PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 16.5 » Programmation serveur » PL/Perl -- Langage de procédures Perl » Triggers PL/Perl

45.6. Triggers PL/Perl #

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