CURRENT_DATE в триггерах postgresql - PullRequest
0 голосов
/ 07 января 2012

У меня есть до вставки триггера в postgres

CREATE OR REPLACE FUNCTION add_requestdate() RETURNS TRIGGER AS $$
DECLARE

BEGIN

    new.requestdate := now();

    RETURN NEW;
END;

$$ LANGUAGE plpgsql;

CREATE TRIGGER addrequestdate
BEFORE INSERT ON requests FOR EACH ROW EXECUTE PROCEDURE add_requestdate ();

Но это не работает!У меня есть решение, которое работает ...

CREATE OR REPLACE FUNCTION add_requestdate() RETURNS TRIGGER AS $$
DECLARE

BEGIN

    UPDATE requests SET requestdate=now() WHERE id=NEW.id;

    RETURN NEW;
END;

$$ LANGUAGE plpgsql;

CREATE TRIGGER addrequestdate
BEFORE INSERT ON requests FOR EACH ROW EXECUTE PROCEDURE add_requestdate ();

У меня только один вопрос.Почему new.requestdate := now(); не работает?

1 Ответ

3 голосов
/ 07 января 2012

это работает - возможно, у вас есть какая-то другая зависимость - странно, ваше работоспособное решение не может работать, потому что до триггера не видит кортеж в таблице, и если вы используете после триггера, вы запускаете рекурсию ..

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 (), это предпочтительное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...