Vous n'êtes pas identifié(e).

#1 07/11/2019 12:23:55

HadanMarv
Membre

Interprétation de requête

Bonjour,

Afin d'effectuer une "migration douce" terme à la mode il parait, j'essaie de mettre en place des triggers sur des tables pour que lors de l'insert ou la modification d'un enregistrement les données créer ou mises à jour soit recopier à l'identique dans une autre table ayant strictement la même structure mais dans un autre schéma.
Avec l'analyse du pg_tables et du pg_attribute j'arrive à généré la requête d'insert sans problème.
Le seul petit soucis, c'est que lors de l'appel du EXECUTE de ma requête généré il me dit à juste titre NEW.nomduchamp non reconnu car il voit çà comme un litteral et non comme une chaine que le moteur doit interprété.
l'erreur exacte est : missing FROM-clause entry for table "new"
J'arrive à générer un truc du style :

INSERT INTO public.MATABLE (field1, field2) values (NEW.field1, NEW.field2);

Je précise que je suis dans un trigger after insert or update.
D'avance merci de vos lumières

HadanMarv

Hors ligne

#2 07/11/2019 13:05:05

HadanMarv
Membre

Re : Interprétation de requête

J'ai trouvé une solution toute simple :

maquery := INSERT INTO public.MATABLE (field1, field2) values ($1.field1, $1.field2);

Et ensuite :

EXECUTE maquery USING NEW;

C'était simple, fallait 'juste' savoir que c'était possible smile
Bonne journée,

HadanMarv

Hors ligne

#3 08/11/2019 12:14:33

gleu
Administrateur

Re : Interprétation de requête

On ne peut pas utiliser NEW dans la chaîne de caractère d'une requete dynamique. Du coup, soit vous faites directement :

maquery := 'INSERT INTO public.MATABLE (field1, field2) values ($1.field1, $1.field2)';
EXECUTE maquery USING NEW;

soit vous faites simplement

INSERT INTO public.MATABLE (field1, field2) values (NEW.field1, NEW.field2);

sans utiliser une chaîne et EXECUTE.


Guillaume.

Hors ligne

#4 08/11/2019 15:51:54

HadanMarv
Membre

Re : Interprétation de requête

Autant pour moi erreur de typo effectivement maquery est bien une variable de type character varying dont la variable est "calculé" à partir d'une requête analysant le catalogue (pg_tables et pg_attributes).

Hors ligne

Pied de page des forums