Обсуждение: Re: [pgsql-ru-general] Номер правки записи
Вообще-то триггер подойдет. Есть триггеры на апдейт и там вам пойдет version = OLD.version + 1; Можно еще покопать в сторону RULE, но надо сразу предупредить, что RULE пользовать **НЕ НАДО** (Уже где-то с 5 версий идет разговор о том, что надо RULE выпилить, но все как-то нет).
Понедельник, 8 июня 2015, 14:49 +03:00 от "Dmitry E. Oboukhov" <unera@debian.org>:
Понедельник, 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
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
> Вообще-то триггер подойдет. Есть триггеры на апдейт и там вам пойдет 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
Вложения
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();
>> а можно пример триггера, а то я тут не понимаю вообще. >> >> есть табличка >> >> ( >> 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