Trigger INSERT OR UPDATE, mise à jour d'une table par par une autre
Bonjour,
En dessous est le trigger sur lequel je travaille. L'objectif est à l'insertion d'une entité dans emprise de remplir certains champs de metadonnees avec les champs d'emprise (gid, date_publication, contributor, code_tranche). Ensuite de répercuter les éventuelles mises à jour dans emprise dans metadonnees et principalement le champ code_tranche.
Je rencontre le problème suivant :
Si le trigger OR UPDATE est actif alors au moment de l'insertion d'un enregistrement dans emprise, le champ contributor de metadonnees est ecrasé par la valeur current_user pour tous les enregistrements8O.
Si le trigger se limite à INSERT OR DELETE alors après l'insertion tout se passe bien : le champ contributor n'est pas remplacé pour tous les enregistrements (ce qui est souhaitable...)
Dans les deux cas, la mise a jour du champ contributor et code_tranche se fait bien si après l'insertion, on vient changer une valeur dans code_tranche de la table emprise.
J'en concluerai que l'UPDATE est la cause de ce dysfonctionnement mais suis incapable de trouver pourquoi.
Merci d'avance pour vos suggestions.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| -- Function: activite.tbl_emprise_metadonnees()
-- DROP FUNCTION activite.tbl_emprise_metadonnees();
CREATE OR REPLACE FUNCTION activite.tbl_emprise_metadonnees()
RETURNS trigger AS
$BODY$
begin
IF (TG_OP = 'INSERT') THEN
insert into activite.metadonnees (gid, date_publication, contributor, code_tranche)
VALUES (new.gid, current_date, current_user, NEW.code_tranche)
;
return new ;
elseif (TG_OP = 'DELETE') THEN
DELETE from activite.metadonnees
where gid = old.gid ;
return old ;
elsif (TG_OP = 'UPDATE') THEN
UPDATE activite.metadonnees
SET (contributor, code_tranche) = (current_user, NEW.code_tranche)
where metadonnees.gid = new.gid
;
return new ;
end if ;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION activite.tbl_emprise_metadonnees()
OWNER TO "POSTGIS";
DROP TRIGGER trg_tbl_emprise_metadonnees ON activite.emprise;
CREATE TRIGGER trg_tbl_emprise_metadonnees
AFTER INSERT OR DELETE OR UPDATE
ON activite.emprise
FOR EACH ROW
EXECUTE PROCEDURE activite.tbl_emprise_metadonnees(); |