Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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: 1132

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)

En ligne

 

#3 Fri 31 August 2018 09:55

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

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)

En ligne

 

Pied de page des forums

Powered by FluxBB