Documentation PostgreSQL 9.4.26 > Programmation serveur > PL/Tcl - Langage de procédures Tcl > Procédures pour déclencheurs en PL/Tcl | |
Accès à la base de données depuis PL/Tcl | Procédures de trigger sur événement 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 :
Nom du déclencheur provenant de l'instruction CREATE TRIGGER.
L'identifiant objet de la table qui est à la cause du lancement du déclencheur.
Le nom de la table qui est à la cause du lancement du déclencheur.
Le schéma de la table qui est à la cause du lancement du déclencheur.
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™.
La chaîne BEFORE, AFTER ou INSTEAD OF suivant le type de l'événement du déclencheur.
La chaîne ROW ou STATEMENT suivant le type de l'événement du déclencheur.
La chaîne INSERT, UPDATE, DELETE ou TRUNCATE suivant le type de l'événement du déclencheur.
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 NULL n'apparaissent pas dans le tableau. Ce paramètre n'est pas initialisé pour les triggers de niveau instruction.
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 NULL n'apparaissent pas dans le tableau. Ce paramètre n'est pas initialisé pour les triggers de niveau instruction.
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 de paires nom de colonne/valeur renvoyée par la commande Tcl array get. Si la valeur de retour est OK, l'opération (INSERT/UP DATE/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 ; le contenu de la ligne modifiée est spécifié par les noms de colonne et par les valeurs dans la liste. Toute colonne non mentionné dans la liste est configuré à NULL. Renvoyer une ligne modifiée n'a un intérêt que pour les triggers niveau ligne pour BEFORE, INSERT ou UPDATE pour laquelle la ligne modifiée sera insérée au lieu de celle donnée dans $NEW ; ou pour les triggers niveau ligne INSTEAD OF, INSERT ou UPDATE où la ligne renvoyée est utilisée comme données sources pour les clauses INSERT RETURNING ou UPDATE RETURNING. Dans les triggers BEFORE DELETE ou INSTEAD OF DELETE de niveau ligne, renvoyer une ligne modifiée a le même effet que renvoyer OK, autrement dit l'opération continue. La valeur de retour est ignorée pour les autres types de triggers.
La liste de résultats peut être réalisée à partie une représentation en tableau de la ligne modifiée avec la commande Tcl array get.
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.