2014-06-08 51 views
2
我在與PostgreSQL中創建觸發器功能故障,應做到以下

在列值:PostgreSQL觸發功能設置基於最近的時間戳

我有類(VARCHAR)的表,EDIT_DATE(時間戳)和實際(布爾)。

我已經有了一個觸發器,它在UPDATE或INSERT上設置實際的時間戳。如果這個edit_date是一個類別中最新的一個,那麼'actual'這個列應該是TRUE。因此,當類別a中有兩個實體時,具有較新近edit_date的實體應設置爲TRUE,而此類別中的另一個應設置爲FALSE。

非常感謝您的幫助,我很困惑這一點。 最好的

回答

0

更新觸發器中同一個表的其他行是非常棘手的,因爲它會導致遞歸觸發器調用。一般來說,你應該避免這樣的解決方案。重新考慮你的數據模型並考慮是否真的需要actual字段。您可以隨時在這樣的查詢選擇實際行(我假設my_table有場id作爲主鍵):

select distinct on(category) id, category, edit_date 
from my_table 
order by 2, 3 desc; 

然而,如果該字段actual是必要的,你可以創建一個功能需要使用它在my_table或乾脆任何變化之後,當:

create or replace function set_my_table_actual() 
returns void language sql 
as $$ 
update my_table t 
set 
    actual = (
     t.id = any (
      select x.id 
      from (
       select distinct on(category) id, category, edit_date 
       from my_table 
       order by 2, 3 desc 
       ) x 
     ) 
    ); 
$$; 

好吧,如果你絕對要一個觸發器,可以使用pg_trigger_depth()功能(這是在Postgres的9.2中引入):

create or replace function my_trigger() 
returns trigger language plpgsql 
as $$ 
begin 
    if pg_trigger_depth() = 1 then 
     perform set_my_table_actual(); 
    end if; 
    return null; 
end $$; 

create trigger my_trigger 
after insert or update or delete 
on my_table for each statement 
execute procedure my_trigger();