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

#1 29/09/2016 13:50:33

fred2193
Membre

[RESOLU] problème Trigger

Bonjour à tous,


Etant débutant avec postgresql, je rencontre un problème dont je n'arrive pas à trouver la solution. J'espère qu'un âme charitable pourra me débloquer.


Voici en résumé ce que doit faire le Trigger :


Pré requis :
- Table A avec un champ id automatique
- Table B contenant une colonne avec le nom de la table A et une colonne avec l'id de la table A


Ce que doit faire le Trigger :
Quand on supprime une ligne dans la table A, il faut aller rechercher la ligne correspondante dans la table b et la supprimer également.


Voici le code que j'ai créé et qui fonctionne presque :


Code du Trigger :

CREATE TRIGGER trigger1
  BEFORE DELETE 
  ON tableA FOR EACH ROW 
  EXECUTE PROCEDURE "fctDeleteTableB"();

Code de la fonction :

CREATE OR REPLACE FUNCTION "fctDeleteTableB" (
)
RETURNS trigger AS
$body$
DECLARE
	sqlinst TEXT;
BEGIN
	sqlinst = format('DELETE FROM TableB WHERE (idTable=%s) AND (NomTable=''TableA'') ', OLD.id) ;
    EXECUTE sqlinst ;
  	return null;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

Phénomène observé :
En exécutant le code suivant :

DELETE FROM TableA WHERE id=3;

J'ai bien la ligne correspondante de la table B qui est supprimée mais la ligne avec l'id 3 de la table A ne l'est pas, ce qui est plutôt ennuyant vu que plus rien ne se supprime dans la table A.


Si quelqu'un à une petite idée d'ou peut venir le problème, je suis preneur smile

Dernière modification par fred2193 (29/09/2016 15:05:12)

Hors ligne

#2 29/09/2016 14:42:27

Marc Cousin
Membre

Re : [RESOLU] problème Trigger

Salut…

Un trigger BEFORE qui retourne NULL annulle l'opération en cours.

Deux solutions ici:

* En faire un trigger AFTER (ce qui suffit vu qu'on ne souhaite pas modifier l'enregistrement)
* Remplacer le RETURN NULL par un RETURN NEW


Marc.

Hors ligne

#3 29/09/2016 14:55:06

fred2193
Membre

Re : [RESOLU] problème Trigger

Marc Cousin a écrit :

Salut…

Un trigger BEFORE qui retourne NULL annulle l'opération en cours.

Deux solutions ici:

* En faire un trigger AFTER (ce qui suffit vu qu'on ne souhaite pas modifier l'enregistrement)
* Remplacer le RETURN NULL par un RETURN NEW


Merci pour la réponse aussi rapide wink


J'ai testé les deux solutions proposées et la première fonctionne. Par contre la deuxième ne fonctionne pas et me donne le même résultat, bizarre.

Hors ligne

#4 29/09/2016 14:56:17

Marc Cousin
Membre

Re : [RESOLU] problème Trigger

Oups, c'est un trigger DELETE. Il n'y a donc pas de NEW. C'est RETURN OLD qui devrait marcher smile


Marc.

Hors ligne

#5 29/09/2016 15:00:00

fred2193
Membre

Re : [RESOLU] problème Trigger

Nikel, effectivement avec le RETUTN OLD sa fonctionne.


Problème réglé et les deux solutions fonctionnes.


Encore Merci Marc.
Bonne journée.

Hors ligne

Pied de page des forums