2009-09-12 60 views
1

觸發:PostgreSQL的簡單的觸發問題

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

而且功能:

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; 

這是爲什麼不工作?沒有錯誤拋出,但ts仍然是空的...

回答

2

我測試你的代碼,它的工作原理:

首先,讓我們創建表:

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

現在,讓我們添加功能:

# 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 

最後,加觸發器:

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

所以,現在,讓我們來測試在它的INSERT部分:

# 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) 

顯然它的工作原理。

現在,更新:

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

TS已經改變。顯然你顯示的代碼有效,所以錯誤必須在其他地方。

顯示在psql我們 「\ d測試」 輸出,並且\ DF +的觸發功能。

0

什麼是你的創建函數的完整語法?這是我創建的函數的完整語法,並且它按預期工作。

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

我加入了完整的功能上面..但似乎大致相同 – David 2009-09-12 16:01:17

+0

我編譯你的函數提供的代碼,和它的工作如預期的我。 – 2009-09-12 16:20:51

+0

你可以做一個\ d 併發布? – 2009-09-12 16:21:29