2009-07-29 7 views
1

j'ai cette simple fonction plpgsql:Postgresql Triggers: passer d'après à avant le déclenchement DonT feu

CREATE FUNCTION "update_times"() RETURNS trigger AS ' 
    BEGIN 
     NEW.update_time = NOW(); 
     RETURN NEW; 
    END;' 
LANGUAGE "plpgsql"; 

--The trigger: 
CREATE TRIGGER test_update_time BEFORE UPDATE ON contact FOR EACH ROW EXECUTE PROCEDURE update_times(); 

et cela fonctionne bien, mais seulement avec des déclencheurs AVANT ...

Je prefern au feu le déclencheur après la mise à jour, donc j'ai changé la fonction et le déclencheur lui-même comme:

CREATE FUNCTION "update_times_after"() RETURNS trigger AS ' 
    BEGIN 
     OLD.update_time = NOW(); 
     RETURN OLD; 
    END;' 
LANGUAGE "plpgsql"; 

--The trigger: 
CREATE TRIGGER test_update_time_after AFTER UPDATE ON contact FOR EACH ROW EXECUTE PROCEDURE update_times_after(); 

Mais le aPRÈS déclencheur ne fonctionnent pas (le le déclencheur ne tire pas ou la fonction échoue).

Qu'est-ce que je fais mal?

Répondre

1

Après le déclenchement est exécuté lorsque les données sont déjà enregistrées dans la table. Donc, aucune modification (surtout sur OLD.!) N'a aucun sens.

Si vous souhaitez modifier les données qui sont enregistrées sur le disque, vous devez le faire AVANT qu'il ne soit enregistré.

+0

Oui mais je veux mettre à jour le champ 'update_time' quand la mise à jour sql a été exécutée et que les données ont été sauvegardées ... – Strae

+0

Je ne sais pas si je comprends. Et quelle est la différence entre avant et après dans ce cas? Quoi qu'il en soit - si vous voulez modifier la ligne en cours d'enregistrement sur la table, cela doit être fait dans le déclencheur BEFORE. –

+0

Ops .. désolé mon mauvais, j'ai mal lu la documentation .. je pensais que le déclencheur BEFORE a été déclenché avant la mise à jour de la ligne, donc si la requête échoue, le déclencheur serait déclenché de toute façon. Ma faute. – Strae

Questions connexes