Postgresql - правило обновления - возможно, иметь последнюю измененную дату, автоматически обновляемую "по обновлению" этой строки?

Я хочу иметь временную метку "lastmodified" (или datetime? not sure, если она имеет значение, отличную от представления данных), чтобы регистрировать последнюю измененную дату/время записи записи.

По-видимому, это возможно с помощью триггеров. Поскольку раньше я не использовал триггеры, я подумал, что сначала могу попробовать "правило обновления", поскольку это тоже ново для меня:

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

У меня есть эта таблица для регистрации данных сеанса клиента:

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

Тогда я мог бы создать такое правило. Я не уверен в синтаксисе, или о том, использовать ли NEW или OLD. Может ли кто-нибудь посоветовать правильный синтаксис?

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

Как вы можете видеть, я хочу обновить только последнюю измененную запись только для пользователя customer_sessionid, поэтому я не уверен, как ссылаться на нее. Запрос UPDATE будет выглядеть следующим образом:

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

Большое спасибо!

Ответ 1

Вы не можете сделать это с помощью правила, так как оно создаст бесконечную рекурсию. Правильный способ - создать перед триггером так же, как предлагалось 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();

Ответ 2

Вы могли бы написать триггер, который должен был бы ПЕРЕД ОБНОВЛЕНИЕМ обновить эту дату.

См. пример 39-4, который добавляет имя пользователя и временную метку перед UPDATE:

http://www.postgresql.org/docs/current/static/plpgsql-trigger.html