Re: Implement updated column in all tables

Поиск
Список
Период
Сортировка
От Scott Marlowe
Тема Re: Implement updated column in all tables
Дата
Msg-id 1120751616.8208.182.camel@state.g2switchworks.com
обсуждение исходный текст
Ответ на Implement updated column in all tables  ("Andrus" <noeetasoftspam@online.ee>)
Список pgsql-general
On Thu, 2005-07-07 at 08:25, Andrus wrote:
> I have the following column in all my tables which contains data of last
> update of this row:
>
> updated timestamp without time zone DEFAULT now() NOT NULL,
>
> Hor to force Postgres to update this column automatically  with now() value
> every time when row is updated ?
>
> I have about 100 tables and don't like to write 100 triggers.


This will work.  Just replace .lm with whatever you want to name your
last modified field.  Assuming all 100 tables have the same name for the
last modified field, applying it should be as easy as a shell script.


-- FUNCTION --

CREATE FUNCTION modtime () RETURNS opaque AS '
    BEGIN
        new.lm :=''now'';
        RETURN new;
    END;
' LANGUAGE 'plpgsql';

-- TABLE --

CREATE TABLE dtest (
    id int primary key,
    fluff text,
    lm timestamp without time zone
);


--TRIGGER --

CREATE TRIGGER dtest
  BEFORE UPDATE or INSERT ON dtest FOR EACH ROW EXECUTE PROCEDURE
    modtime(lm);

-- SQL TESTS --

INSERT INTO dtest (id, fluff) VALUES (1,'this is a test');
INSERT INTO dtest (id, fluff) VALUES (2,'this is another test');
SELECT * FROM dtest;
  1 | this is a test       | 2003-04-02 10:33:12.577089
  2 | this is another test | 2003-04-02 10:33:18.591148
UPDATE dtest SET id=3 WHERE id=1;
  3 | this is a test | 2003-04-02 10:34:52.219963  [1]
UPDATE dtest SET fluff='now is the time' WHERE id=2;
SELECT * FROM dtest WHERE id=2;
  2 | now is the time | 2003-04-02 10:38:06.259443 [2]
UPDATE dtest SET lm='2003-04-02 08:30:00' WHERE id=3;
SELECT * FROM dtest WHERE id=3;
  3 | this is a test | 2003-04-02 10:36:15.45687 [3]

[1] The timestamp has changed for this record when we changed the id field.
[2] The timestamp also changes for the fluff field.
[3] We tried to set lm, but the trigger on that field in dtest intercepted the change and forced it

В списке pgsql-general по дате отправления:

Предыдущее
От: Ropel
Дата:
Сообщение: Re: How to force Postgres to calculate MAX(boolean)
Следующее
От: David Pratt
Дата:
Сообщение: Re: Transparent i18n?