38.6. Proc�dures pour d�clencheurs en PL/Tcl

Les proc�dures pour d�clencheurs peuvent �tre �crites en PL/Tcl. PostgreSQL requiert qu'une proc�dure, devant �tre appel�e en tant que d�clencheur, doit �tre d�clar�e comme une fonction sans arguments et retourner une valeur de type trigger.

L'information du gestionnaire de d�clencheur est pass�e au corps de la proc�dure avec les variables suivantes :

$TG_name

Nom du d�clencheur provenant de l'instruction CREATE TRIGGER.

$TG_relid

L'identifiant objet de la table qui est � la cause du lancement du d�clencheur.

$TG_relatts

Une liste Tcl des noms des colonnes de la table, pr�fix�e avec un �l�ment de liste vide. Donc, rechercher un nom de colonne dans la liste avec la commande lsearch de Tcl renvoie le num�ro de l'�l�ment, en commen�ant � 1 pour la premi�re colonne, de la m�me fa�on que les colonnes sont num�rot�es personnellement avec PostgreSQL.

$TG_when

La cha�ne BEFORE ou AFTER suivant le type d'appel du d�clencheur.

$TG_level

La cha�ne ROW ou STATEMENT suivant le type d'appel du d�clencheur.

$TG_op

La cha�ne INSERT, UPDATE ou DELETE suivant le type d'appel du d�clencheur.

$NEW

Un tableau associatif contenant les valeurs de la nouvelle ligne de la table pour les actions INSERT ou UPDATE ou vide pour DELETE. Le tableau est index� par nom de colonne. Les colonnes nulles n'apparaissent pas dans le tableau.

$OLD

Un tableau associatif contenant les valeurs de l'ancienne ligne de la table pour les actions UPDATE or DELETE ou vide pour INSERT. Le tableau est index� par nom de colonne. Les colonnes nulles n'apparaissent pas dans le tableau.

$args

Une liste Tcl des arguments de la proc�dure ainsi que l'instruction CREATE TRIGGER. Ces arguments sont aussi accessibles par $1 ... $n dans le corps de la proc�dure.

Le code de retour d'une proc�dure d�clencheur peut �tre faite avec une des cha�nes OK ou SKIP ou une liste renvoy�e par la commande Tcl array get. Si la valeur de retour est OK, l'op�ration (INSERT/UPDATE/DELETE) qui a lanc� le d�clencheur continuera normalement. SKIP indique au gestionnaire de d�clencheurs de supprimer silencieusement l'op�ration pour cette ligne. Si une liste est renvoy�e, elle indique � PL/Tcl de renvoyer la ligne modifi�e au gestionnaire de d�clencheurs qui l'ins�rera au lieu de celle donn�es par $NEW (ceci fonctionne seulement pour INSERT et UPDATE). Inutile de dire que tout ceci est vraiment significatif lorsque le d�clencheur est BEFORE et FOR EACH ROW ; sinon le code de retour est ignor�.

Voici un petit exemple de proc�dure d�clencheur qui force une valeur enti�re dans une table pour garder trace du nombre de mises � jour r�alis�es sur la ligne. Pour les nouvelles lignes ins�r�es, la valeur est initialis�e � 0 puis incr�ment�e � chaque op�ration de mise � jour.

CREATE FUNCTION trigfunc_modcount() RETURNS trigger AS '
    switch $TG_op {
        INSERT {
            set NEW($1) 0
        }
        UPDATE {
            set NEW($1) $OLD($1)
            incr NEW($1)
        }
        default {
            return OK
        }
    }
    return [array get NEW]
' LANGUAGE pltcl;

CREATE TABLE mytab (num integer, description text, modcnt integer);

CREATE TRIGGER trig_mytab_modcount BEFORE INSERT OR UPDATE ON mytab
    FOR EACH ROW EXECUTE PROCEDURE trigfunc_modcount('modcnt');

Notez que la proc�dure d�clencheur elle-m�me ne conna�t pas le nom de la colonne ; c'est fourni avec les arguments du d�clencheur. Ceci permet � la proc�dure d�clencheur d'�tre r�-utilis�e avec diff�rentes tables.