2012-01-05 18 views
10

Quiero tener una marca de tiempo "lastmodified" (o datetime? No estoy seguro si hace una diferencia que no sea la presentación de los datos) para registrar la última fecha/hora de modificación de la entrada de ese registro.Postgresql - regla de actualización - ¿es posible tener una fecha de última modificación, actualizada automáticamente "en la actualización" de esa fila?

Aparentemente esto es posible usando activadores. Ya que no he utilizado disparadores antes, pensé primero que pude probar una "regla de actualización", ya que es nuevo para mí también:

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

Lo que tengo es esta tabla para registrar los datos de la sesión de un cliente:

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. 
    */ 

Entonces podría crear una regla como esta. No estoy seguro acerca de la sintaxis, o si usar NEW o OLD. ¿Alguien podría aconsejar la sintaxis correcta?

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 

Como se puede ver Quiero actualizar la entrada de LastModified sólo eso customer_sessionid, así que no estoy seguro de cómo hacer referencia a ella. La consulta de ACTUALIZAR sería la siguiente:

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

¡Muchas gracias!

Respuesta

19

Usted no puede hacerlo con una regla, ya que crearía un bucle infinito. La forma correcta es crear un antes del disparador, al igual que duffymo propuesto.

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