Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблемы с RULE?
|
|||
|---|---|---|---|
|
#18+
У меня есть таблица 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-ы не совпадают. В чем может быть дело? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 17:05 |
|
||
|
Проблемы с RULE?
|
|||
|---|---|---|---|
|
#18+
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 то же касается и набора записей, если в руле у вас не один стейтмент, а мн-во. каждый сейтмент пересчитывает набор записей, на которые он должен подействовать. в итоге - в большинстве случаев в руле надо попросту вызывать ХП, которая внутри себя ничего не пересчитает (иначе ими пользоваться например для вью с функционально-дефолтными полями просто не получится). В вашем же случае - просто написать триггер, который, кстати сказать, будет побыстрее руле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 17:24 |
|
||
|
Проблемы с RULE?
|
|||
|---|---|---|---|
|
#18+
"... 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-е ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 18:05 |
|
||
|
Проблемы с RULE?
|
|||
|---|---|---|---|
|
#18+
4321 и akie, большое спасибо за ответы. Попробовал и то и другое (триггеры и изменения руля). Работает прекрасно. Но что из них лучше? Действительно ли триггер будет всегда быстрее? У меня таких таблиц около 50, по которым логи надо вести, поэтому это важное для меня решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 18:13 |
|
||
|
Проблемы с RULE?
|
|||
|---|---|---|---|
|
#18+
dimabin4321 и akie, большое спасибо за ответы. Попробовал и то и другое (триггеры и изменения руля). Работает прекрасно. Но что из них лучше? Действительно ли триггер будет всегда быстрее? У меня таких таблиц около 50, по которым логи надо вести, поэтому это важное для меня решениеесли вам потребуется вставить в таблицу определенное id, а не по счетчику (например руками вернуть что-то из удаленного) - руле на карвале наколется (или вставит карвал от прошлой вставки по дефолту в сессии, либо пошлет вас куда подальше - т.к. в сессии счетчик еще не наваривался). Если такой универсальности не требуется (попытка вставить конкретное значение id а не дефаулт наказываются расстрелом в администативном порядке) -пользуйтесь руле. по поводу логов - можете сделать одну триггерную ф-ю на все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 18:35 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=315&tid=2006165]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 343ms |

| 0 / 0 |
