это работает - возможно, у вас есть какая-то другая зависимость - странно, ваше работоспособное решение не может работать, потому что до триггера не видит кортеж в таблице, и если вы используете после триггера, вы запускаете рекурсию ..
postgres=# create table x(a int, b date, c timestamp);
CREATE TABLE
postgres=# create function fxx()
postgres-# returns trigger as $$
postgres$# begin
postgres$# new.b := now();
postgres$# new.c := now();
postgres$# return new;
postgres$# end;
postgres$# $$ language plpgsql;
CREATE FUNCTION
postgres=# create trigger xxxx before insert on x for each row execute procedure fxx();
CREATE TRIGGER
postgres=# insert into x(a) values(10);
INSERT 0 1
postgres=# insert into x(a) values(209);
INSERT 0 1
postgres=# select * from x;
a │ b │ c
─────┼────────────┼────────────────────────────
10 │ 2012-01-07 │ 2012-01-07 18:36:57.665283
209 │ 2012-01-07 │ 2012-01-07 18:37:00.853442
(2 rows)
Итак, вы можете использовать CURRENT_DATE вместо now (), это предпочтительное решение.