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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 03 May 2019 10:27

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

[Pg96]Trigger : condition sur application name

Aloha

Nous avons un ensemble de tables qui ont deux colonnes contenant sensiblement la même information : une colonne rotation et une colonne orientation. L'une est destinée à être utilisée dans Qgis, l'autre dans un autre outil.

Nous rencontrons un problème : si il est simple de créer un trigger mettant à jour la colonne orientation depuis la valeur rotation, nous ne savons pas comment créer un trigger qui mettrait à jour la valeur orientation si la valeur rotation change et la valeur rotation si la valeur orientation change, sans que cela ne crée une boucle "infinie".
Nous pensions passer l'information du nom de l'application pour gérer les différents cas dans le trigger :

Quelque chose comme

Code:

create or replace function api_sig.maj_orient()
returns trigger
language plpgsql
as $function$

declare
v_app varchar(255)

begin

if "application_name" = 'QGIS'
then .... new.orientation:= 360-new.rotation ;
else ....  new.rotation := 360+new.orientation ;
end if ;

return new;
end,
$function$;

Avez-vous déjà passé ce type de paramètre à une fonction/trigger ? Est-ce une méthode efficace ? Vaut-il mieux envisager le problème autrement ?

D'avance, merci


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#2 Fri 03 May 2019 14:54

tevrard
Participant assidu
Date d'inscription: 23 May 2016
Messages: 320

Re: [Pg96]Trigger : condition sur application name

La question que tu soulèves me fait penser au point "FOR EACH ROW / FOR EACH STATEMENT" dont on avait discuté ici :
https://georezo.net/forum/viewtopic.php?id=112809

Hors ligne

 

#3 Fri 03 May 2019 16:21

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: [Pg96]Trigger : condition sur application name

Merci.

Pas faux.

J'ai aussi résolu le problème en passant comme ceci :

Code:

CREATE OR REPLACE FUNCTION api_sig.maj_orient()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
 
DECLARE
    v_application_name varchar;
    v_ownertable varchar;
BEGIN

-- la fonction a pour objet de renvoyer la bonne valeur dans la table geomorient (ACAD MAP) si 
-- l'attribut rotation est mis à jour et inversement
-- attention au boucle infinie...

--cas update 
IF TG_OP = 'UPDATE' THEN
-- mise à jour de geomorient
    if old.rotation is null or (old.rotation <> 360 - new.geomorient) 
        then new.rotation := 360 - new.geomorient;
    end if;
    -- mise à jour de rotation
    if old.geomorient is null or (-new.rotation +360 <>  old.geomorient)
        then new.geomorient := -new.rotation +360;
        raise notice '% => %', old.geomorient, new.geomorient;
    end if;
end if ;

--cas insert
IF TG_OP = 'INSERT' then
    if new.geomorient is not null and new.rotation is null 
        then new.rotation := 360 - new.geomorient;
    end if;
    if new.rotation is not null and new.geomorient is null
        then new.geomorient := -new.rotation +360;
    end if;
end if;
return NEW;
END;
 
$function$
;

COMMENT ON FUNCTION api_sig.maj_orient() IS 'Fonction générique pour la mise à jour des orientations / rotations.';

create
    trigger tel_regardorient before insert
        or update
            of rotation,
            geomorient on
            corps_rue.tel_regard for each row execute procedure api_sig.maj_orient();;

Et cela fonctionne tel que désiré.

Dernière modification par Pierre (Fri 03 May 2019 16:22)


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

Pied de page des forums

Powered by FluxBB