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

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

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

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: 1129

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

 

Pied de page des forums

Powered by FluxBB