Par jackt81 le 08/03/2006 - 18:02
Bonjour,
je progresse un peu dans mes fonctions "trigger" (je suis en version 8.0.3).
j'ai réalisé une fonction pour me renseigner sur les update ou delete effectués dans une table contenant environ 50 colonnes.
Comment savoir quelle colonne a été modifiée ?
pour le moment (voir fonction), j'utilise 2 variables temporaires que je concatène avant l'insert.
voici la fonction :
CREATE OR REPLACE FUNCTION proc_update_dosbase()
RETURNS "trigger" AS
$BODY$
DECLARE
action_effectuee text; -- UPDATE ou DELETE
valeur_initiale text; -- Valeur avant modification
valeur_modifiee text; -- Valeur après modification
nom_utilisateur text; -- Utilisateur connecté
table_en_cause text; -- Nom de la table
valeur_temp1 text; -- Valeur temporaire
valeur_temp2 text; -- Valeur temporaire
dt_modif date; -- pour récupérer la date courante
hr_modif time; -- pour récupérer l'heure courante
BEGIN
nom_utilisateur := user;
action_effectuee := TG_OP ;
table_en_cause := TG_RELNAME;
SELECT INTO dt_modif current_date;
SELECT INTO hr_modif substr(current_time,1,8);
-- Pour tracer une variable, utiliser la syntaxe ci-dessous.
-- RAISE NOTICE 'calling proc_update_dosbase(%)', variable Ă tracer;
IF action_effectuee = 'DELETE' THEN
SELECT INTO valeur_temp1 OLD.codedose FROM dosbase ;
SELECT INTO valeur_temp2 OLD.pourcontr FROM dosbase ;
valeur_initiale := valeur_temp1 || '\n' || valeur_temp2;
INSERT INTO audit values
(dt_modif, hr_modif, action_effectuee, valeur_initiale, NULL, nom_utilisateur, table_en_cause);
RETURN OLD;
ELSE
SELECT INTO valeur_temp1 OLD.codedose FROM dosbase ;
SELECT INTO valeur_temp2 OLD.pourcontr FROM dosbase ;
valeur_initiale := valeur_temp1 || '\n' || valeur_temp2;
SELECT INTO valeur_temp1 NEW.codedose FROM dosbase ;
SELECT INTO valeur_temp2 NEW.pourcontr FROM dosbase ;
valeur_modifiee := valeur_temp1 || '\n' || valeur_temp2;
INSERT INTO audit values
(dt_modif, hr_modif, action_effectuee, valeur_initiale, valeur_modifiee, nom_utilisateur, table_en_cause);
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Si vous avez une solution ...
merci