postgresql触发器中的CURRENT_DATE

时间:2012-01-07 17:11:51

标签: sql postgresql triggers

我在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 个答案:

答案 0 :(得分:3)

它工作 - 可能你有一些其他依赖 - 很奇怪,你的可行解决方案无法工作,因为在触发器没有看到表中的元组,如果你使用触发后,那么你开始递归..

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(),这是更好的解决方案。