2009-09-12 8 views
1

déclencheur:PostgreSQL question simple déclencheur

CREATE TRIGGER "tr_update_ts" BEFORE INSERT OR UPDATE 
ON "public"."test" FOR EACH ROW 
EXECUTE PROCEDURE "public"."update_ts"(); 

et la fonction est:

CREATE OR REPLACE FUNCTION "public"."update_ts"() RETURNS trigger AS 
$body$ 
DECLARE 
BEGIN 
    NEW.ts := now(); 
RETURN NEW; 
END; 
$body$ 
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; 

Pourquoi ce ne fonctionne pas? Pas d'erreur levée, mais le ts est toujours nul ...

Répondre

2

J'ai testé votre code et il fonctionne:

Tout d'abord, nous allons créer la table:

# create table test (x int4, ts timestamptz); 
CREATE TABLE 

Maintenant, la fonction ajouter:

# CREATE OR REPLACE FUNCTION "public"."update_ts"() RETURNS trigger AS 
>> $body$ 
>> DECLARE 
>> BEGIN 
>> NEW.ts := now(); 
>> RETURN NEW; 
>> END; 
>> $body$ 
>> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; 
CREATE FUNCTION 

Et enfin, ajoutez un déclencheur:

# CREATE TRIGGER "tr_update_ts" BEFORE INSERT OR UPDATE 
>> ON "public"."test" FOR EACH ROW 
>> EXECUTE PROCEDURE "public"."update_ts"(); 
CREATE TRIGGER 

Donc, maintenant, nous allons tester sur une partie INSERT de celui-ci:

# insert into test (x) values (1); 
INSERT 0 1 
# select * from test; 
x |    ts 
---+------------------------------- 
1 | 2009-09-12 19:54:50.812139+02 
(1 row) 

Il est clair que cela fonctionne.

Maintenant, la mise à jour:

# update test set x = 2; 
UPDATE 1 
# select * from test; 
x |    ts 
---+------------------------------- 
2 | 2009-09-12 19:54:57.463933+02 
(1 row) 

ts a été modifiée. Clairement, le code que vous avez montré fonctionne, donc l'erreur doit être ailleurs.

Afficher la sortie "\ d test" de psql, et \ df + de la fonction de déclenchement.

0

Quelle est la syntaxe complète de votre fonction de création? Voici la syntaxe complète de la fonction que j'ai créée, et cela fonctionne comme prévu.

create function update_timestamp() RETURNS trigger AS $$ 
BEGIN 
    NEW.ts := now(); 
RETURN NEW; 
END; 
$$ language plpgsql; 
+0

J'ai ajouté la fonction complète ci-dessus .. mais il semble surtout la même – David

+0

J'ai compilé le code que vous avez fourni pour votre fonction, et cela a fonctionné comme prévu pour moi. –

+0

Pouvez-vous faire un \ d et l'afficher? –