2012-01-07 101 views
0

我的PostgresCURRENT_DATE PostgreSQL中觸發

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(); 

INSERT觸發器之前有,但它不工作!我有解決方案...

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();不起作用?

+0

出現什麼錯誤?在我的PostgreSQL 9.0版本中,第一個例子沒有問題。你可以放置表定義和你運行的SQL命令?你的PostgreSQL版本是? – doctore 2012-01-07 17:35:47

+0

請定義「不起作用!」。如果'requests.id'不唯一 - 在具有相同'id'的其他行上,第二個觸發器只能有效。 'id'是唯一的嗎?是否還有其他觸發器? – 2012-01-08 02:32:04

回答

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(),它是最好的解決方案。