37.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. 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->{relname}

Nom de la table 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();