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

Я хочу иметь «последнюю модифицированную» временную метку (или дату-время? Не уверен, если она имеет значение, отличное от представления данных) для записи последней измененной даты / времени записи этой записи.

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

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

Тогда я мог бы создать такое правило. Я не уверен насчет синтаксиса, или использовать НОВЫЙ или СТАРЫЙ. Кто-нибудь может посоветовать правильный синтаксис?

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

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

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

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

Ответы [ 2 ]

28 голосов
/ 05 января 2012

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

Вы можете написать триггер, который будет запускать BEFORE UPDATE для изменения этой даты.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...