PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 Re : Général » PostGIS Trigger et update de deux tables ayant une relation spatiale » 22/03/2017 16:55:09

J'ai trouvé la réponse grâce à de l'aide sur le forum GEOREZO.
Je la dépose ici aussi au cas où cela aiderai quelqu'un ;-)

En imaginant une table "commune" et une table "points"

Code de la fonction :

CREATE OR REPLACE FUNCTION public.maj()
  RETURNS trigger AS
$BODY$
DECLARE
BEGIN

IF TG_OP = 'INSERT' or TG_OP = 'UPDATE' THEN
  update public.points set id_commune = public.commune.gid FROM public.commune where st_within (points.geometrie, commune.geometrie);

END IF;
return     NEW; 
END;$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;
ALTER FUNCTION public.maj()
  OWNER TO postgres;

Code du trigger :

CREATE TRIGGER trigger_maj
  AFTER INSERT OR UPDATE OF geometrie
  ON public.commune
  FOR EACH ROW
  EXECUTE PROCEDURE public.maj();

#2 Général » PostGIS Trigger et update de deux tables ayant une relation spatiale » 21/03/2017 23:15:38

annesig
Réponses : 1

Bonjour,

Je dispose de deux couches géographiques gérées sous PostGIS.
L'une est de type polygones. L'autre contient des points.
Il existe une relation entre ces deux tables : les points sont positionnés dans les polygones.

Je souhaiterais écrire un déclencheur et sa fonction de telle manière que :
pour chaque mise à jour de la colonne géométrique ou insertion dans la table qui contient les polygones,
la tables des points soient également mise à jour.

Cette table de points contient un champ "id_polygon".
Je souhaiterais que ce champ se remplisse ainsi automatiquement à partir des valeurs id des polygones au sein desquels il sont positionnés.

De quelle manière procéderiez-vous ?
Je vous remercie par avance

#4 Général » Fonction qui exploite TG_TABLE_SCHEMA & TG_TABLE_NAME » 21/03/2017 14:51:42

annesig
Réponses : 2

Bonjour,

J'ai une base de données pour laquelle toutes les tables métiers dispose d'un même champ "datemaj" (pour date de la dernière mise à jour).
Je souhaite mettre en place une fonction qui me permettrait grâce à un trigger de mettre ce champ à jour automatiquement.

Je pensais :
- créer une fonction générique qui met à jour le champ "datemaj" de la table qui a déclenché la fonction avec une fonction "current_date"
- créer un trigger pour chq table qui lance cette fonction après un INSERT ou un UPDATE FOR tous les champs sauf "datemaj"

Pour les triggers pas de soucis

Pour la fonction, je rencontre un problème.

J'ai écrit :

CREATE OR REPLACE FUNCTION metier.mafonction()
  RETURNS trigger AS
$BODY$
DECLARE
identifiant INTEGER;
BEGIN 
identifiant := NEW.objectid;
IF (TG_OP = 'UPDATE') THEN
UPDATE TG_TABLE_SCHEMA.TG_TABLE_NAME
SET datemaj = current_date
WHERE objectid = identifiant;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
UPDATE TG_TABLE_SCHEMA.TG_TABLE_NAME
SET datemaj = current_date
WHERE objectid = identifiant;
RETURN NEW;
ELSE
RAISE WARNING '[metier.mafonction] - Other action occurred: %, at %', TG_OP,now();
RETURN NULL;
END IF;
END;
$BODY$

Et lorsque j'effectue une modification dans la table, j'obtiens le message d'erreur suivant :

TG_TABLE_SCHEMA.TG_TABLE_NAME n'existe pas

Merci d'avance pour votre aide :-)
Anne

Pied de page des forums

Propulsé par FluxBB