Vous n'êtes pas identifié(e).
Bonjour à tous,
ravi de vous retrouver aujourd'hui pour un nouveau problème.
J'essaie de mettre en place un trigger, qui permet de modifier une colonne B (en y intégrant le texte 'Modifié'), si une colonne A est modifiée.
Voici le code actuel :
CREATE OR REPLACE FUNCTION update_modifs()
RETURNS "trigger" AS $BODY$
BEGIN
NEW.colonneB:='Modifié';
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql'IMMUTABLE;
ALTER FUNCTION update_modifs() OWNER TO postgres;
CREATE TRIGGER update_modifs
BEFORE INSERT OR UPDATE OF colonneA ON table
FOR EACH ROW
EXECUTE PROCEDURE update_modifs();
Et avec toutes la doc, je ne vois pas du tout d'où peut venir le problème, il me met le message suivant :
ERROR: syntax error at or near "OF"
LIGNE 16 : AFTER INSERT OR UPDATE OF colonneA ON table
Le OF le dérange visiblement. Avez-vous une explication?
Hors ligne
Non, aucun problème de syntaxe. Enfin, en 9.0 et 9.1. En 8.4, j'ai exactement la même erreur que vous… puisque les triggers sur colonnes ne sont supportés qu'en 9.0 et supérieurs.
Marc.
Hors ligne
C'est donc ça!
De quoi s'arracher les cheveux. Il n'existe aucun moyen de contourner ce problème avec la 8.4 ?
Hors ligne
En 8.4, il faut faire un trigger sur la table, et détecter ce qui a changé sur l'enregistrement: quelque chose comme IF new.cola <> old.cola mais en faisant attention aux valeurs NULL: «new.cola <> old.cola» vaudra NULL si une des deux valeurs est NULL, ce qui empêcherait le déclenchement de ce qui est dans le IF.
C'est évidemment plus simple si on a une contrainte NOT NULL.
Dernière modification par Marc Cousin (29/11/2011 13:16:09)
Marc.
Hors ligne
D'accord, merci Marc, donc j'ai testé et voici une solution codée :
CREATE OR REPLACE FUNCTION update_modifs()
RETURNS "trigger" AS
$BODY$
BEGIN
IF
old.colonneA IS NULL OR new.colonneA IS NULL
THEN
NEW.coloneB='';
RETURN NEW;
ELSIF
new.colonneA<>old.colonneA
THEN
NEW.coloneB:='Modifié';
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql'IMMUTABLE;
ALTER FUNCTION update_modifs() OWNER TO postgres;
CREATE TRIGGER update_modifs
BEFORE INSERT OR UPDATE ON table
FOR EACH ROW
EXECUTE PROCEDURE update_modifs();
A bientôt!
Hors ligne
Il me semble que ce trigger ne retourne pas NEW quand colonneA n'a pas changé et n'est pas NULL, dans ce cas il ne retourne rien.
C'est une erreur, il faut obligatoirement retourner NEW.
Accessoirement, pour ce genre de test le plus simple est d'utiliser IF new.colonneA IS DISTINCT FROM old.colonneA THEN... END IF, qui fonctionne comme attendu y compris quand il y a des valeurs nulles.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne