Previous Up Next
Université Lille 3-Charles de GaulleUFR de Mathématiques Sciences Économiques et Sociales

Chapitre 61  PL/pgSQL : procédures déclencheurs

PL/pgSQL peut être utilisé pour définir des procédures déclencheur. Une procédure déclencheur est créée grâce à la commande CREATE FUNCTION utilisée comme fonction sans arguments ayant un type de retour trigger. Notez que la fonction doit être déclarée avec aucun argument même si elle s'attend à recevoir les arguments spécifiés dans CREATE TRIGGER (les arguments trigger sont passés via TG_ARGV, comme décrit plus loin).

Quand une fonction PL/pgSQL est appelée en tant que trigger, plusieurs variables spéciales sont créées automatiquement dans le bloc de plus haut niveau. Ce sont :
NEW
 
Type de données RECORD ; variable contenant la nouvelle ligne de base de données pour les opérations INSERT/UPDATE dans les déclencheurs de niveau ligne. Cette variable est null dans un trigger de niveau instruction.
OLD
 
Type de données RECORD ; variable contenant l'ancienne ligne de base de données pour les opérations UPDATE/DELETE dans les triggers de niveau ligne. Cette variable est null dans les triggers de niveau instruction.
TG_NAME
 
Type de données name ; variable qui contient le nom du trigger réellement lancé.
TG_WHEN
 
Type de données text ; une chaîne, soit BEFORE soit AFTER selon la définition du déclencheur.
TG_LEVEL
 
Type de données text ; une chaîne, soit ROW soit STATEMENT selon la définition du déclencheur.
TG_OP
 
Type de données text ; une chaîne, INSERT, UPDATE, ou DELETE indiquant pour quelle opération le déclencheur a été lancé.
TG_RELID
 
Type de données oid ; l'ID de l'objet de la table qui a causé l'invocation du trigger.
TG_RELNAME
 
Type de données name ; le nom de la table qui a causé l'invocation du trigger.
TG_NARGS
 
Type de données integer ; le nombre d'arguments donnés à la procédure déclencheur dans l'instruction CREATE TRIGGER.
TG_ARGV[]
 
Type de donnée text ; les arguments de l'instruction CREATE TRIGGER. L'index débute à 0. Les indices invalides (inférieurs à 0 ou supérieurs ou égaux à tg_nargs) auront une valeur nulle.
Une fonction déclencheur doit renvoyer soit null soit une valeur record/ligne ayant exactement la structure de la table pour laquelle le déclencheur a été lancé. La valeur de renvoi d'un déclencheur de niveau instruction BEFORE ou AFTER ou un déclencheur de niveau ligne AFTER est ignoré ; il peut être null. Cependant, n'importe lequel de ces déclencheurs peut interrompre l'opération déclencheur entière en levant une erreur.

Les déclencheurs de niveau ligne lancés BEFORE peuvent renvoyer null pour indiquer au gestionnaire de déclencheur de sauter le reste de l'opération pour cette ligne (les déclencheurs suivants ne sont pas lancés, et les INSERT/UPDATE/DELETE ne se font pas pour cette ligne). Si une valeur non null est renvoyée alors l'opération se déroule avec cette valeur ligne. Renvoyer une valeur ligne différente de la valeur originale de NEW modifie la ligne qui sera insérée ou mise à jour. Il est possible de remplacer des valeurs seules directement dans NEW et de renvoyer NEW, ou de construire un nouveau record/ligne à renvoyer.

L'exemple suivant montre un exemple d'une procédure déclencheur dans PL/pgSQL.

Cet exemple de déclencheur assure qu'à chaque moment où une ligne est insérée ou mise à jour dans la table, le nom d'utilisater courant et l'heure sont estampillés dans la ligne. Et cela assure qu'un nom d'employé est donné et que le salaire est une valeur positive.
CREATE TABLE emp (
    empname text,
    salary integer,
    last_date timestamp,
    last_user text
);
CREATE FUNCTION emp_stamp() RETURNS trigger AS '
    BEGIN
        -- Verifie que empname et salary sont donnés
        IF NEW.empname IS NULL THEN
            RAISE EXCEPTION ''empname cannot be null'';
        END IF;
        IF NEW.salary IS NULL THEN
            RAISE EXCEPTION ''% cannot have null salary'', NEW.empname;
        END IF;

        -- Qui travaille pour nous quand elle doit payer pour cela ?
        IF NEW.salary < 0 THEN
            RAISE EXCEPTION ''% cannot have a negative salary'', NEW.empname;
        END IF;

        -- Rappelons nous qui a changé le payroll quand
        NEW.last_date := ''now'';
        NEW.last_user := current_user;
        RETURN NEW;
    END;
' LANGUAGE plpgsql;
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
D.Gonzalez (gonzalez@univ-lille3.fr) en date du th , 

Previous Up Next