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 : PL/pgSQL » [RESOLU] problème Trigger » 29/09/2016 15:00:00

Nikel, effectivement avec le RETUTN OLD sa fonctionne.


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


Encore Merci Marc.
Bonne journée.

#2 Re : PL/pgSQL » [RESOLU] problème Trigger » 29/09/2016 14:55:06

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.

#3 PL/pgSQL » [RESOLU] problème Trigger » 29/09/2016 13:50:33

fred2193
Réponses : 4

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

Pied de page des forums

Propulsé par FluxBB