powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблемы с RULE?
5 сообщений из 5, страница 1 из 1
Проблемы с RULE?
    #33913947
dimabin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть таблица name_ref
id int4 NOT NULL DEFAULT nextval(('name_ref_id_seq'::text)::regclass),
name varchar(50),
tab int4 NOT NULL DEFAULT 1

Также есть таблица logs_changes.hist_name_ref, в которой я держу историю изменений в name_ref
id int4 NOT NULL,
name varchar(50),
tab int4 NOT NULL,
change_id int8 NOT NULL

Также стоит RULE:
CREATE OR REPLACE RULE log_name_ref_ins AS
ON INSERT TO name_ref DO
INSERT INTO logs_changes.hist_name_ref (id, name, tab, change_id) SELECT new.id, new.name, new.tab, logs_changes.log_change('name_ref'::character varying, 'I'::character varying) AS log_change;

Так вот. Когда я делаю INSERT INTO name_ref (tab, name) VALUES (1, 'test'), то в таблицу name_ref добавляется запись с ID=1506, а в таблицу logs_changes.hist_name_ref с ID=1507, то есть ID-ы не совпадают. В чем может быть дело?
...
Рейтинг: 0 / 0
Проблемы с RULE?
    #33914002
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimabin Так вот. Когда я делаю INSERT INTO name_ref (tab, name) VALUES (1, 'test'), то в таблицу name_ref добавляется запись с ID=1506, а в таблицу logs_changes.hist_name_ref с ID=1507, то есть ID-ы не совпадают. В чем может быть дело?БОЯН

ищи по форуму.

общий смысл проблемы - руле не атомарны. т.е. передавая в него выражения New.id вы каждый раз (при каждом упоминании) вызываете ф-ию, находящуюся в определении дефаулта для id

то же касается и набора записей, если в руле у вас не один стейтмент, а мн-во. каждый сейтмент пересчитывает набор записей, на которые он должен подействовать. в итоге - в большинстве случаев в руле надо попросту вызывать ХП, которая внутри себя ничего не пересчитает (иначе ими пользоваться например для вью с функционально-дефолтными полями просто не получится). В вашем же случае - просто написать триггер, который, кстати сказать, будет побыстрее руле.
...
Рейтинг: 0 / 0
Проблемы с RULE?
    #33914106
akie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"... The SERIAL column NEW.job_id is effectively replaced by
nextval(...) and the nextval() function is called twice--once for the
original row and once for that traced row."
(http://www.varlena.com/GeneralBits/101.php)

используй currval('name_ref_id_seq'::text) вместо new.id в RULE-е
...
Рейтинг: 0 / 0
Проблемы с RULE?
    #33914125
dimabin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 и akie,
большое спасибо за ответы. Попробовал и то и другое (триггеры и изменения руля). Работает прекрасно. Но что из них лучше? Действительно ли триггер будет всегда быстрее?
У меня таких таблиц около 50, по которым логи надо вести, поэтому это важное для меня решение
...
Рейтинг: 0 / 0
Проблемы с RULE?
    #33914170
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimabin4321 и akie,
большое спасибо за ответы. Попробовал и то и другое (триггеры и изменения руля). Работает прекрасно. Но что из них лучше? Действительно ли триггер будет всегда быстрее?
У меня таких таблиц около 50, по которым логи надо вести, поэтому это важное для меня решениеесли вам потребуется вставить в таблицу определенное id, а не по счетчику (например руками вернуть что-то из удаленного) - руле на карвале наколется (или вставит карвал от прошлой вставки по дефолту в сессии, либо пошлет вас куда подальше - т.к. в сессии счетчик еще не наваривался). Если такой универсальности не требуется (попытка вставить конкретное значение id а не дефаулт наказываются расстрелом в администативном порядке) -пользуйтесь руле.

по поводу логов - можете сделать одну триггерную ф-ю на все
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проблемы с RULE?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]