#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