2012-01-05 12 views
10

Chcę mieć "lastmodified" znacznik czasu (lub datetime? Nie jestem pewien, czy robi on różnicy inne niż prezentacja danych), aby zarejestrować datę/czas ostatniej modyfikacji wpisu tego rekordu.Postgresql - reguła aktualizacji - możliwe, że data ostatniej modyfikacji, automatycznie aktualizowana "na aktualizację" tego wiersza?

Podobno jest to możliwe za pomocą wyzwalaczy. Ponieważ nie zostały wykorzystane wyzwalacze wcześniej, myślałem, że po raz pierwszy spróbować „zasady aktualizacji”, ponieważ jest to dla mnie nowe też:

http://www.postgresql.org/docs/8.3/static/rules-update.html

Co mam jest to stół do logowania danych sesji klienta:

CREATE TABLE customer_session (
    customer_sessionid serial PRIMARY KEY, 
    savedsearch_contents text, 
    lastmodified timestamp default now() 
); /* 
    @ lastmodified - should be updated whenever the table is updated for this entry, just for reference. 
    */ 

Potem mógłbym stworzyć taką regułę. Nie jestem pewien co do składni ani czy używać NEW lub OLD. Czy ktokolwiek mógłby doradzić poprawną składnię?

CREATE RULE customer_session_lastmodified AS 
ON UPDATE TO customer_session 
DO UPDATE customer_session SET lastmodified = current_timestamp WHERE customer_sessionid = NEW.customer_sessionid 

Jak widać Chcę zaktualizować lastModified wjazd tylko, że customer_sessionid, więc nie jestem pewien, jak go odwołać. Zapytanie UPDATE wygląda następująco:

UPDATE customer_session SET savedsearch_contents = 'abcde' 
WHERE customer_sessionid = {unique customer ID} 

Wielkie dzięki!

Odpowiedz

19

Nie można zrobić to z reguły, ponieważ byłoby stworzyć nieskończoną rekurencję. Prawidłowy sposób polega na utworzeniu przed wyzwalaczem, tak jak zaproponowano duffymo.

CREATE FUNCTION sync_lastmod() RETURNS trigger AS $$ 
BEGIN 
    NEW.lastmodified := NOW(); 

    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER 
    sync_lastmod 
BEFORE UPDATE ON 
    customer_session 
FOR EACH ROW EXECUTE PROCEDURE 
    sync_lastmod(); 
Powiązane problemy