Vous n'êtes pas identifié(e).
Pages : 1
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
Dernière modification par fred2193 (29/09/2016 15:05:12)
Hors ligne
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
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
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
Oups, c'est un trigger DELETE. Il n'y a donc pas de NEW. C'est RETURN OLD qui devrait marcher
Marc.
Hors ligne
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
Pages : 1