powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблема с рекусией
8 сообщений из 8, страница 1 из 1
проблема с рекусией
    #33438095
Фотография Кабан Савраскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здраствуйте. возникла проблема с рекурсивным вызовом правила

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE testing
(
  id serial primary key,
  s_id text,
  b_in int4,
  status int4 DEFAULT  1 
);

CREATE OR REPLACE RULEtesting_u AS
    ON UPDATE TO testing
   WHERE new.b_in <  0  DO  UPDATE testing SET status =  0 
  WHERE testing.id = new.id;

причем ошибка infinite recursion возникает даже в том случае если условие b_in<0 для правила не выполняется.

подскажите как это можно обойти. (а то к концу дня башка уже гудит)
...
Рейтинг: 0 / 0
проблема с рекусией
    #33438103
Фотография Кабан Савраскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно же
Код: plaintext
1.
2.
...
CREATE OR REPLACE RULE testing_u AS
...
...
Рейтинг: 0 / 0
проблема с рекусией
    #33438367
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The query trees generated from rule actions are thrown into the rewrite system again, and maybe more
rules get applied resulting in more or less query trees. So a rule's actions must have either a
different command type or a different result relation than the rule itself
is on, otherwise this
recursive process will end up in an infinite loop.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
проблема с рекусией
    #33438373
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кабан Савраскин wrote:
> подскажите как это можно обойти. (а то к концу дня башка уже гудит)

Триггер AFTER UPDATE?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
проблема с рекусией
    #33438534
Фотография Кабан Савраскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо большое
...
Рейтинг: 0 / 0
проблема с рекусией
    #33440016
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
канечна триггер - ано карашо... (уж с рули-то наковырнуться -как 2 байта абаслать - они и ф-ии перезапрашивают, и вообще не довольствуются проверкой условий на момент начала, а пересчитывают в каждом предложении т.е. ведут себя наподобь апдейтов в интербейсе).

Но в чисто конкретном случае можно было вот так:
Код: plaintext
1.
2.
3.
4.
5.
CREATE OR REPLACE RULE testing_u AS
   ON INSERT TO testing
   WHERE status <> 0  AND b_in <  0 
   DO 
UPDATE testing SET status =  0 
  WHERE testing.id = new.id;
...
Рейтинг: 0 / 0
проблема с рекусией
    #33442156
Кабан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4321канечна триггер - ано карашо... (уж с рули-то наковырнуться -как 2 байта абаслать - они и ф-ии перезапрашивают, и вообще не довольствуются проверкой условий на момент начала, а пересчитывают в каждом предложении т.е. ведут себя наподобь апдейтов в интербейсе).

Но в чисто конкретном случае можно было вот так:
Код: plaintext
1.
2.
3.
4.
5.
CREATE OR REPLACE RULE testing_u AS
   ON INSERT TO testing
   WHERE status <> 0  AND b_in <  0 
   DO 
UPDATE testing SET status =  0 
  WHERE testing.id = new.id;

в том то и проблема, что так тоже пробовал, но все равно вываливалась в рекурсив. что странно. то есть получается что тело правила анализировалось до условия hwere :(
...
Рейтинг: 0 / 0
проблема с рекусией
    #33443646
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кабан в том то и проблема, что так тоже пробовал, но все равно вываливалась в рекурсив. что странно. то есть получается что тело правила анализировалось до условия hwere :( Звиняюсь, при тесте сполз с UPDATE на INSERT

--по поводу анализа тела ли, условия ли - фсё фихня. Просто руле в постгрессе - одно сплошное недоразумение. Например вот такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE OR REPLACE RULE testing_u AS
   ON UPDATE TO testing
   WHERE FALSE 
   DO 
UPDATE testing SET status =  0 
  WHERE FALSE;
тоже якобы породает бесконечную рекурсию . Короче - в этой области у них шаромыжник на шаромыжнике кодит. "РазбойникиВорыУроды, СобакаНеТойПороды" (с)

Хотя я вот тут подумал - ошибка у меня идет пг-админовская, а не скль-ная. Могабыть это эти перцы налажали? И зря я на постгресовцев всех собак валю - над о б выборочно? ... Нет перепроверил из под аксесса. Даже вот такая штука не очень проходит:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE FUNCTION f_rule_test( int4) RETURNS void AS
$BODY$
UPDATE testing SET status =  0 
  WHERE status<> 0  
AND id = $ 1 
AND b_in< 0 
-- FALSE;
$BODY$
LANGUAGE 'sql' VOLATILE;

CREATE OR REPLACE RULE testing_u AS
    ON UPDATE TO testing
   WHERE
 new.status <> 0   AND
 new.b_in <  0 
 DO 
SELECT f_rule_test(new.id);
вот так чуть лучше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION f_rule_test( int4, int4) RETURNS void AS
$BODY$
UPDATE testing SET status =  0 
  WHERE 
--status<>0  AND
 id = $ 1 
--AND b_in<0
AND $ 2 < 0 
;
$BODY$
LANGUAGE 'sql' VOLATILE;

CREATE OR REPLACE RULE testing_u AS
    ON UPDATE TO testing
   WHERE
 new.status <> 0   AND
 new.b_in <  0 
 DO 
SELECT f_rule_test(new.id, new.b_in);
но при прямом апдейте статуса выставляется именно апдейтный, а не рульный (посмотрев на это, приходишь к выводу, что надо накручивать INSTEAD, с перечнем всех полей, шо не вдохновляет... кароче триггер на бефоре (new.status = 0; Return New;) много тут выигрышнее смотрится)

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


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