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

44.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, TRUNCATE, INSTEAD OF 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 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 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 FUNCTION valid_id();