#1 Thu 30 August 2018 18:50
- Clothilde B
- Juste Inscrit !
- Lieu: Bastia
- Date d'inscription: 18 Jan 2018
- Messages: 9
Trigger nom du champ modifié
Bonjour,
Je cherche à compléter ma fonction détaillant les instructions déclenchées par les trigger pour qu'elle me renvoie le nom du champ modifié dans la table de suivi.
Code:
CREATE OR REPLACE FUNCTION public.fonction_histo() RETURNS TRIGGER AS $body$ BEGIN IF (TG_OP = 'UPDATE') THEN INSERT INTO public.histo (nom_table, nom_colonne, utilisateur, action, ancienne_valeur, nouvelle_valeur, detail_maj, gid_objet) VALUES (TG_TABLE_NAME::TEXT,______, session_user::TEXT, TG_OP, OLD, NEW, current_query(), OLD.id); RETURN NEW; ELSIF (TG_OP = 'DELETE') THEN INSERT INTO public.histo (nom_table, nom_colonne, utilisateur, action, ancienne_valeur, detail_maj, gid_objet) VALUES (TG_TABLE_NAME::TEXT,______, session_user::TEXT, TG_OP, OLD, current_query(), OLD.id); RETURN OLD; ELSIF (TG_OP = 'INSERT') THEN INSERT INTO public.histo (nom_table, nom_colonne, utilisateur, action, nouvelle_valeur, detailmaj, gid_objet) VALUES (TG_TABLE_NAME::TEXT, ______, session_user::TEXT, TG_OP, NEW, current_query(), OLD.id); RETURN NEW; END IF; END; $body$ LANGUAGE 'plpgsql' ;
Que dois-je mettre dans "______ " si je souhaite avoir le nom du champ modifié par requête ?
Merci à tous pour votre aide,
Hors ligne
#2 Fri 31 August 2018 09:22
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Trigger nom du champ modifié
Salut,
malheureusement je ne crois pas que cela soit possible,
cf: https://www.postgresql.org/docs/10/stat … igger.html
Un moyen de s'en sortir, serait d'utiliser le type json dans la table d'historique.
Dernière modification par tumasgiu (Fri 31 August 2018 10:09)
Hors ligne
#3 Fri 31 August 2018 09:55
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Trigger nom du champ modifié
Un petit exemple :
Code:
CREATE TABLE public.histo(nom_table TEXT, data JSON, action TEXT); CREATE OR REPLACE FUNCTION public.fonction_histo() RETURNS TRIGGER AS $body$ DECLARE o RECORD[]; n RECORD[]; BEGIN IF (TG_OP = 'UPDATE') THEN SELECT array_agg((key,value)) INTO o FROM json_each(row_to_json(OLD)); SELECT array_agg((key,value)) INTO n FROM json_each(row_to_json(NEW)); FOR i IN 1 .. array_upper(o, 1) LOOP IF o[i].value <> n[i].value THEN EXECUTE 'INSERT INTO public.histo(nom_table, data, action) VALUES ($1, row_to_json($2), $3);' USING TG_TABLE_NAME::TEXT, n[i], TG_OP::TEXT END IF; END LOOP; RETURN NEW; END IF; END; $body$ LANGUAGE 'plpgsql' ;
Ici on enregistre chaque colonne modifiée est enregistrée dans une ligne spécifique
mais on pourrait dire qu'une ligne -> une commande et que data contient toutes les colonnes
modifiées.
Dernière modification par tumasgiu (Fri 31 August 2018 10:04)
Hors ligne