#1 Thu 30 August 2018 18:50
- Clothilde B
- Participant occasionnel
- Lieu: Bastia
- Date d'inscription: 18 Jan 2018
- Messages: 12
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: 1218
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: 1218
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


