#1 Wed 30 April 2014 16:00
- Stych
- Participant occasionnel
- Date d'inscription: 24 Mar 2014
- Messages: 15
Déclencheur trigger opérant sur plusieurs table
Bonjour,
Je suis étudiant (en stage) et je dois mettre en place une base de données sur postgres/postgis.
J'ai une base de donnée contenant plusieurs tables géométriques et UNE seule table contenant les métadonnées (données alphanumériques).
chaque table contenant une géométrie ne représente qu'une seul ligne dans la table métadonnée., et ont en commun le nom de la donnée (champs "nom_donnee").
Les tables ont les structures suivantes :
Code:
table_1 (Géométriques) CREATE TABLE trait_de_cote.dep56pwgs84 ( nom_donnee character varying(80), nom_theme character varying(30), site character varying(50), date_creation date, date_etude character varying(15), auteur character varying(20), srid character varying(30), extension character varying(10), lien character varying(500), the_geom_wgs84 geometry(MultiPolygon,4326), id character varying(80) NOT NULL, CONSTRAINT dep56pwgs84_pkey PRIMARY KEY (id)); table_2 (métadonnées) CREATE TABLE trait_de_cote.metadonnee_trait_de_cote ( nom_donnee character varying(80) NOT NULL, nom_theme character varying(30), site character varying(50), date_creation date, date_etude character varying(9), auteur character varying(20), srid character varying(30), extension character varying(10), lien character varying(500), CONSTRAINT metadonnee_trait_de_cote_pkey PRIMARY KEY (nom_donnee));
Ce que j'essaie de faire c'est de mettre a jour les champs de la table_1 en fonction de chaque insertion, mise à jour et suppression de la table_2.
J'ai pour l'instant réussis à créer un trigger qui fonctionne mais qui n'opère que sur une seule table à la fois.
Code trigger :
Code:
CREATE OR REPLACE FUNCTION process_trait_de_cote_atlantique() RETURNS TRIGGER AS $trait_de_cote_atlantique$ DECLARE meta metadonnee_trait_de_cote.nom_donnee%type; BEGIN select into meta * from metadonnee_trait_de_cote where nom_donnee='trait_de_cote_atlantique' and new.nom_donnee='trait_de_cote_atlantique'; IF (TG_OP = 'INSERT') and meta ='trait_de_cote_atlantique' THEN update trait_de_cote_atlantique set nom_donnee= new.nom_donnee, nom_theme=new.nom_theme, site= new.site, date_creation= new.date_creation, date_etude=new.date_etude, auteur= new.auteur, srid= new.srid, extension= new.extension, lien= new.lien; RETURN NEW; ELSIF (TG_op = 'UPDATE') and meta ='trait_de_cote_atlantique' THEN update trait_de_cote_atlantique set nom_donnee= new.nom_donnee,nom_theme=new.nom_theme, site= new.site, date_creation= new.date_creation, date_etude=new.date_etude, auteur= new.auteur, srid= new.srid, extension= new.extension, lien= new.lien; RETURN NEW; ELSIF (TG_op = 'DELETE')and meta ='trait_de_cote_atlantique' THEN Drop table trait_de_cote_atlantique; RETURN OLD; END IF; RETURN NULL; END; $trait_de_cote_atlantique$ LANGUAGE plpgsql; CREATE TRIGGER trait_de_cote_atlantique AFTER INSERT OR UPDATE OR DELETE ON metadonnee_trait_de_cote FOR EACH ROW EXECUTE PROCEDURE process_trait_de_cote_atlantique();
Ce que j'aimerai serait que le déclencheur du trigger puisse récupérer le nom de chaque table (possédant une géométrie) et opère une insertion, un update ou un delete si cela a été effectué dans la table métadonnée sur la ligne qui lui correspondant (donc en fonction de "nom_donnee").
J'avais tout d'abord pensé à créer autant de triggers que j'ai de couches (114 au total -__-') mais cela n'automatise pas l'opération lors de l'ajout d'une nouvelle couche. On m'a donc conseillé de générer une variable qui contiendra le nom de la table à modifier. Ce que j'ai fait, mais la variable n'étant pas une relation existante de la base, rien ne s'effectue.
Je me tourne donc vers la communauté GeoRezo pour avoir quelques conseils et pistes de réflexions.
J'espère avoir été suffisament précis dans mes explications...
Merci d'avance pour d'éventuelles réponses. (y)
ps:J'ai parcourus les différents forums concernant les triggers mais j'avoue na pas avoir trouvé la solution à mon problème.
Stych.
Dernière modification par Stych (Wed 30 April 2014 16:00)
Hors ligne