Thread: Re: [pgsql-ru-general] Номер правки записи

Re: [pgsql-ru-general] Номер правки записи

From
Warstone@list.ru
Date:
Вообще-то триггер подойдет. Есть триггеры на апдейт и там вам пойдет version = OLD.version + 1; Можно еще покопать в сторону RULE, но надо сразу предупредить, что RULE пользовать **НЕ НАДО** (Уже где-то с 5 версий идет разговор о том, что надо RULE выпилить, но все как-то нет).


Понедельник, 8 июня 2015, 14:49 +03:00 от "Dmitry E. Oboukhov" <unera@debian.org>:
Есть табличка

orders: id, col1, col2, ...

И есть код в виде n клиентов, находящийся в разных репозитариях
которые эту табличку модифицируют


каждый модифицирует что-то свое вроде

UPDATE
    orders
SET
    col1 = bla
WHERE
    id = 123

Далее хочется подвести статистику сколько раз в среднем каждый order
за период своей жизни модифицируется.

Для этого вводим столбик:

ALTER TABLE orders ADD COLUMN "version" INTEGER NOT NULL DEFAULT 0;

И далее надо пройтись по всем запросам UPDATE и расставить в SET

, version = version + 1

Все вроде просто, но после того как статистика будет снята это все
хочется обратно убрать итп.

то есть код на несколько недель.

вопрос а как эту задачу решить средствами БД?
то есть решить так чтобы не увеличивать нагрузку?
добавление оператора в SET считаем что нагрузку не увеличивает.
а дополнительный запрос увеличивает.

триггеры тут вроде не подходят (потому что модифицируется та же
запись, на которой триггер, плюс нагрузка)

что еще можно придумать?

--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera@debian.org jabber://UNera@uvw.ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537

Re: Re: [pgsql-ru-general] Номер правки записи

From
"Dmitry E. Oboukhov"
Date:
> Вообще-то триггер подойдет. Есть триггеры на апдейт и там вам пойдет version =
> OLD.version + 1; Можно еще покопать в сторону RULE, но надо сразу предупредить,
> что RULE пользовать **НЕ НАДО** (Уже где-то с 5 версий идет разговор о том, что
> надо RULE выпилить, но все как-то нет).

а можно пример триггера, а то я тут не понимаю вообще.

есть табличка

(
    id: SERIAL,
    field: TEXT,
    version: INTEGER
)

Нужно написать триггер который будет на каждый

UPDATE table SET field = 'bla' WHERE id = 123;

делать инкремент version попутно.

я примерно понимаю как INSTEAD OF триггер на UPDATE тут написать, но в
INSTEAD OF триггере придется всегда перечислять ВСЕ поля в записях.
то есть для таблички из 100 столбиков это меганакладно + придется
всякий ALTER TABLE делать и ALTER TRIGGER

> Понедельник, 8 июня 2015, 14:49 +03:00 от "Dmitry E. Oboukhov"
> <unera@debian.org>:

> Есть табличка

> orders: id, col1, col2, ...

> И есть код в виде n клиентов, находящийся в разных репозитариях
> которые эту табличку модифицируют

> каждый модифицирует что-то свое вроде

> UPDATE
> orders
> SET
> col1 = bla
> WHERE
> id = 123

> Далее хочется подвести статистику сколько раз в среднем каждый order
> за период своей жизни модифицируется.

> Для этого вводим столбик:

> ALTER TABLE orders ADD COLUMN "version" INTEGER NOT NULL DEFAULT 0;

> И далее надо пройтись по всем запросам UPDATE и расставить в SET

> , version = version + 1

> Все вроде просто, но после того как статистика будет снята это все
> хочется обратно убрать итп.

> то есть код на несколько недель.

> вопрос а как эту задачу решить средствами БД?
> то есть решить так чтобы не увеличивать нагрузку?
> добавление оператора в SET считаем что нагрузку не увеличивает.
> а дополнительный запрос увеличивает.

> триггеры тут вроде не подходят (потому что модифицируется та же
> запись, на которой триггер, плюс нагрузка)

> что еще можно придумать?

> --

> . ''`. Dmitry E. Oboukhov
> : :’ : email: unera@debian.org jabber://UNera@uvw.ru
> `. `~’ GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
--

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Attachment

Re: Re: [pgsql-ru-general] Номер правки записи

From
Andrey Oktyabrskiy
Date:
On 06/08/2015 08:13 PM, Dmitry E. Oboukhov wrote:
 > а можно пример триггера, а то я тут не понимаю вообще.
 >
 > есть табличка
 >
 > (
 >      id: SERIAL,
 >      field: TEXT,
 >      version: INTEGER
 > )
 >
 > Нужно написать триггер который будет на каждый
 >
 > UPDATE table SET field = 'bla' WHERE id = 123;
 >
 > делать инкремент version попутно.
CREATE OR REPLACE FUNCTION incver () RETURNS TRIGGER AS $$
BEGIN
   IF TG_OP = 'INSERT' THEN
     new.version := 1;
   ELSIF TG_OP = 'UPDATE' THEN
     new.version := old.version + 1;
   END IF;
   RETURN new;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER tbl_inc_version BEFORE INSERT OR UPDATE ON tbl
   FOR EACH ROW EXECUTE PROCEDURE incver();


Re: Re: [pgsql-ru-general] Номер правки записи

From
"Dmitry E. Oboukhov"
Date:
>> а можно пример триггера, а то я тут не понимаю вообще.
>>
>> есть табличка
>>
>> (
>>      id: SERIAL,
>>      field: TEXT,
>>      version: INTEGER
>> )
>>
>> Нужно написать триггер который будет на каждый
>>
>> UPDATE table SET field = 'bla' WHERE id = 123;
>>
>> делать инкремент version попутно.
> CREATE OR REPLACE FUNCTION incver () RETURNS TRIGGER AS $$
> BEGIN
> IF TG_OP = 'INSERT' THEN
> new.version := 1;
> ELSIF TG_OP = 'UPDATE' THEN
> new.version := old.version + 1;
> END IF;
> RETURN new;
> END;
> $$ LANGUAGE plpgsql;

а допустимо разве менять переменные внутри NEW?
ухты, я в этом направлении ничего не знал даже.

пошел читать документацию...

> CREATE TRIGGER tbl_inc_version BEFORE INSERT OR UPDATE ON tbl
> FOR EACH ROW EXECUTE PROCEDURE incver();

--

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera@debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537

Attachment