#1 Tue 31 July 2018 13:15
- SIGCMC56
- Participant occasionnel
- Date d'inscription: 9 Jul 2018
- Messages: 28
UPDATE sur un Trigger avec PostgreSQL
Bonjour,
Je travaille avec Postgresql et QGIS 2.18. J'essaye de faire fonctionner un Trigger qui permettrait la mise à jour des données saisies via une Vue dans QGIS.
Tout fonctionne pour l'insertion de nouvelles données, mais je n'arrive pas à mettre à jour ou supprimer.
Qgis me retourne le message d'erreur : ERROR: column reference "id_A" is ambiguous.
Le code de mon Trigger est le suivant :
Code:
CREATE OR REPLACE FUNCTION MonTrigger() RETURNS trigger AS $BODY$ DECLARE id_A BIGINT; BEGIN IF (TG_OP = 'INSERT') THEN SELECT nextval('seq_A') INTO NEW.id_A; INSERT INTO TableA (id_A, geom, num_A) VALUES (NEW.id_A, NEW.geom, NEW.num_A); INSERT INTO TableB (A_id, num_B) VALUES (NEW.id_A, NEW.num_B); RETURN NEW; ELSIF (TG_OP = 'UPDATE') THEN UPDATE TableA SET (geom, num_A) = (NEW.geom, NEW.num_A) WHERE id_A = NEW.id_A; UPDATE TableB SET (num_B) = (NEW.num_B) WHERE A_id = NEW.id_A; RETURN NEW; ELSIF (TG_OP = 'DELETE') THEN DELETE FROM TableA WHERE id_A = OLD.id_A; DELETE FROM TableB WHERE A_id = OLD.id_A; RETURN NULL; END IF; END; $BODY$
Quelqu'un peut-il m'aider?
Hors ligne
#2 Tue 31 July 2018 15:55
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: UPDATE sur un Trigger avec PostgreSQL
Je me demande si le fait de déclarer votre variable utilisée pour la séquence de l'insert, du même nom que le champ identifiant qui sert dans le clause where de l'update ou le delete ne le gène pas ?!
Vous avez essayé en lui donnant un autre nom dans votre déclaration de variable ?
Hors ligne
#3 Tue 31 July 2018 16:20
Re: UPDATE sur un Trigger avec PostgreSQL
Bonjour,
Sauf erreur, la ligne
Code:
DECLARE id_A BIGINT;
ne sert à rien et comme le dit Ben22 provoque certainement l'erreur. Ce serait plutôt (non testé) :
Code:
CREATE OR REPLACE FUNCTION MonTrigger() RETURNS trigger AS $BODY$ BEGIN IF (TG_OP = 'INSERT') THEN SELECT nextval('seq_A') INTO NEW.id_A; INSERT INTO TableA (id_A, geom, num_A) VALUES (NEW.id_A, NEW.geom, NEW.num_A); INSERT INTO TableB (A_id, num_B) VALUES (NEW.id_A, NEW.num_B); RETURN NEW; ELSIF (TG_OP = 'UPDATE') THEN UPDATE TableA SET (geom, num_A) = (NEW.geom, NEW.num_A) WHERE id_A = NEW.id_A; UPDATE TableB SET (num_B) = (NEW.num_B) WHERE A_id = NEW.id_A; RETURN NEW; ELSIF (TG_OP = 'DELETE') THEN DELETE FROM TableA WHERE id_A = OLD.id_A; DELETE FROM TableB WHERE A_id = OLD.id_A; RETURN NULL; END IF; END; $BODY$ Quelqu'un peut-il m'aider?
Jean-Marie
Azimut
Hors ligne