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

Код: plaintext
1.
create rule temp_insert AS ON INSERT TO temp WHERE new.two IS NULL DO INSTEAD INSERT INTO temp (one, two) values(DEFAULT, new.one);

И получаю следующую ругань:

Код: plaintext
1.
2.
3.
4.
5.
insert into temp values( 1 );
ERROR:  обнаружена бесконечная рекурсия в правилах для отношения "temp"

insert into temp values( 1 , 2 );
ERROR:  обнаружена бесконечная рекурсия в правилах для отношения "temp"

Ежу понятно, что рекурсия хоть и есть, но она отнюдь не бесконечная, как с этим бороться?
Спасибо.
...
Рейтинг: 0 / 0
RULE и бесконечная рекурсия
    #34794120
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если создать триггер на таблицу в нем проверить и подменить NEW.two = NEW.one
...
Рейтинг: 0 / 0
RULE и бесконечная рекурсия
    #34794122
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamirА если создать триггер на таблицу в нем проверить и подменить NEW.two = NEW.oneвместо руля
...
Рейтинг: 0 / 0
RULE и бесконечная рекурсия
    #34794220
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усложним :)
Собственно я пытаюсь симитировать поведение поля IDENTITY
Код: plaintext
1.
create table temp (one serial, two char( 9 ));
Теперь наша задача преобразовать при помощи правил запрос
Код: plaintext
1.
2.
3.
insert into temp values('1');
преобразовать в
insert into temp values(DEFAULT, '1');
А запрос
Код: plaintext
1.
insert into temp (two) values('1');
Оставить так, как он есть.
Прошу обратить внимание, что типы данных столбцов - разные. Для RULE это не проблема, по крайне мере следующий код:
Код: plaintext
1.
create rule temp_insert AS ON INSERT TO temp WHERE new.two IS NULL DO INSTEAD SELECT new.one, new.two;
работает без матов.
Посмотрю сейчас, что можно сделать тригерами.
...
Рейтинг: 0 / 0
RULE и бесконечная рекурсия
    #34794957
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С тригерами получается пока следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table temp(one serial, two char( 9 ));

create function trig() returns opaque as
$$
DECLARE
BEGIN
new.two := new.one; new.one := nextval('temp_one_seq');
return new;
END;
$$
language 'plpgsql';

create trigger temp_trig BEFORE INSERT ON temp FOR EACH ROW EXECUTE PROCEDURE trig();
Пытаемся вставить значение:
Код: plaintext
1.
2.
insert into temp values('req');
ERROR:  неверный входной синтаксис для integer: "req"
Что впрочем не удивительно :(
...
Рейтинг: 0 / 0
RULE и бесконечная рекурсия
    #34795471
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZashibisЕжу понятно, что рекурсия хоть и есть, но она отнюдь не бесконечная, как с этим бороться?
Спасибо.божишмой. сделайте (дайте юзверю вместо таблицы) вью, на вью навесьте руле на вставку. руле будет фтыкать уже _в_таблицу_ - никакой рекурсии не возникнет
...
Рейтинг: 0 / 0
RULE и бесконечная рекурсия
    #34795608
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZashibisУсложним :)
Собственно я пытаюсь симитировать поведение поля IDENTITY
Код: plaintext
1.
create table temp (one serial, two char( 9 ));
Теперь наша задача преобразовать при помощи правил запрос
Код: plaintext
1.
2.
3.
insert into temp values('1');
преобразовать в
insert into temp values(DEFAULT, '1');
А запрос
Код: plaintext
1.
insert into temp (two) values('1');
Оставить так, как он есть.Откуда возникла такая задача?

На ум приходит: раньше была таблица temp (two char(9)), в нее захотели добавить поле serial, чтобы при этом запросы к таблице insert into temp values('1') и insert into temp (two) values('1') не переписывать. Если это так, то надо сделать create table temp (two char(9), one serial).
...
Рейтинг: 0 / 0
RULE и бесконечная рекурсия
    #34795860
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал через 2 таблицы, работает :)
Одна таблица - рабочая, вторая - временная, с RULE на INSERT и передачей данных в Настоящую таблицу.

Задача эта появилось по следующим причинам:
Пишу транслятор SQL запросов для 1С 7.7 из MS SQL Server в PostgreSQL
Соответственно создаются таблицы, содержащие поля IDENTITY, которые особым образом обрабатываются в INSERT, и имеется огромная куча запросов типа INSERT INTO таблица VALUES(?,?,?,?,?), а так же SELECT * FROM таблица, и тут хоть вешайся - никакой serial сам по себе не спасает :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / RULE и бесконечная рекурсия
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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