powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транзакции и правило на Insert
10 сообщений из 10, страница 1 из 1
Транзакции и правило на Insert
    #34203202
vald2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

В кратце опищу ситуацию, в БД создана view с 4 правилами, на insert, update, delete и select.
Правило на select выводит данные из таблицы table, собственно так уж получается что вьюшка создана только для фильтрации, данных из таблицы, каким-то пользователя доступны одни записи в таблице, а другим другие.

Правила insert, update, delete попросту перенаправляют запрос из view в таблицу. Все работает просто замечательно, при выполнении запросов по одному из консоли, но при работе программного обеспечения возникает проблемка.

Программка открывает транзакцию, выполняет вставку во view-> должно сработать правило insert-> запись в таблицу, потом запращивает ID последней аставленной записи -> закрыть транзкцию, но как бы не так нет ее.

Запросы я проверял, по отдельности, не используя транзацию они выполняются!

1.Так собственно в чем же дело??? Что не так или может как-то можно обойти эту ситуацию
...
Рейтинг: 0 / 0
Транзакции и правило на Insert
    #34203294
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
распишите вью и RULE
сдается вы упираетесь в DEFAULT-ы для ...
(справочно: - для вью можно задать другие дефаулты, чем для таблицы).
или еще во что-то.
...
Рейтинг: 0 / 0
Транзакции и правило на Insert
    #34203498
vald2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да на DEFAULT я уже напоролся и добавил для них проверку COALESCE(new.filed,0)
Вы можете уточнить будут ли правила работать совместно с транзакциями...
...
Рейтинг: 0 / 0
Транзакции и правило на Insert
    #34203947
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конечно правила прекрасно работают с/в транзакциях!!!
но как бы не так нет ее.
А что значит "нет ее"? Ошибка какаят-то?
...
Рейтинг: 0 / 0
Транзакции и правило на Insert
    #34204008
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поскольку слово DEFAULT работает с недоделками, а именно вот так (или через COALESCE) нельзя
Код: plaintext
1.
2.
CREATE OR REPLACE RULE "_INSERT" AS
    ON INSERT TO vw_t1 DO INSTEAD  INSERT INTO t1 (id, capt) 
  VALUES (CASE WHEN new.id IS NULL THEN DEFAULT ELSE new.id END, DEFAULT);
(вместо этого после создания vw_t1 с
... DO INSTEAD INSERT INTO t1 (id, capt) VALUES (new.id, new.capt);
надо сделать для этого ВЬЮ так !
ALTER TABLE vw_t1 ALTER COLUMN id SET DEFAULT nextval('t1_id_seq'::regclass);
если еще не изменили)


то для пробы делаем так:
Код: plaintext
1.
2.
CREATE OR REPLACE RULE "_INSERT" AS
    ON INSERT TO vw_t1 DO INSTEAD  INSERT INTO t1 (id, capt) 
  VALUES (DEFAULT, DEFAULT);

Далее запускаем такую последовательность
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
-- Executing query:
BEGIN;

Query returned successfully with no result in  16  ms.

-- Executing query:
SELECT * FROM  vw_t1;

Total query runtime:  15  ms.
Data retrieval runtime:  16  ms.
 3  rows retrieved.

-- Executing query:
INSERT INTO vw_t1 (id)  VALUES ( 1111 );

Query returned successfully:  1  rows affected,  16  ms execution time.

-- Executing query:
SELECT * FROM  vw_t1;

Total query runtime:  16  ms.
Data retrieval runtime:  16  ms.
 4  rows retrieved.

-- Executing query:
INSERT INTO vw_t1 (id)  VALUES ( 1111 );

Query returned successfully:  1  rows affected,  16  ms execution time.

-- Executing query:
SELECT * FROM  vw_t1;

Total query runtime:  15  ms.
Data retrieval runtime:  16  ms.
 5  rows retrieved.

-- Executing query:
SELECT currval('t1_id_seq');

Total query runtime:  16  ms.
Data retrieval runtime:  0  ms.
 1  rows retrieved.

-- Executing query:
ROLLBACK;

Query returned successfully with no result in  32  ms.

-- Executing query:
SELECT * FROM  vw_t1;

Total query runtime:  31  ms.
Data retrieval runtime:  0  ms.
 3  rows retrieved.
как видим все работает. Транзакция откатывается. Т.е. все -внутри
...
Рейтинг: 0 / 0
Транзакции и правило на Insert
    #34206811
vald2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4321
то для пробы делаем так:
Код: plaintext
1.
2.
CREATE OR REPLACE RULE "_INSERT" AS
    ON INSERT TO vw_t1 DO INSTEAD  INSERT INTO t1 (id, capt) 
  VALUES (DEFAULT, DEFAULT);


Спасибо за подсказку все заработало, записи добавляются почти так как надо, осталось только вот что: если в правиле в VALUES стоят DEFAULT, то и в таблицу попадают значения по умолчанию,
а не new.field_name.

Я вместо DEFAULT пославил COALESCE(new.field_name,0) все заработало в таблицу записалось вносимое значение, но вы пишите что так делать нельзя, как тогда выкрутиться?
...
Рейтинг: 0 / 0
Транзакции и правило на Insert
    #34208368
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vald2006 4321то для пробы ...:
Код: plaintext
 VALUES (DEFAULT...);


Я ... пославил COALESCE(new.field_name,0)...
но вы пишите что так делать нельзя, как тогда выкрутиться?
если дефолтные значения полей у вас - 0 , то можно. (но и в этом случае засада - если поле Null -абельно, то Null вы в него не вставите)

если же DEFAULT-ы функциональны (или вам надо оставить возможность вставки Null) - то надо _СОЗДАТЬ_ дефолтные значения (отдельно) на колонки_самого_вью.
Еще раз: создайте _отдельно_ собственные DEFAULT на колонки ВЬЮ, возможно( но не обязательно) отличающиеся от дефолтов колонок таблицы.
Пример того, как это делается я приводил:
Код: plaintext
ALTER TABLE vw_t1 ALTER COLUMN id SET DEFAULT nextval('t1_id_seq'::regclass);
т.е. пишете ALTER TABLE , не смотря на то, что vw_t1 - не тейбл, а вью.
И после этого, если вы во вью вставите не все данные, то свои дефолты вью само передаст вашему руле, а уже ваше руле (безо всяких COALESCE-в. И без упоминания DEFAULT в RULE) вставит переданные ему значения в таблицу.
Т.е. полный цикл примерно такой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE t1
(
  id serial NOT NULL,
  capt text,
  CONSTRAINT pk_t1 PRIMARY KEY (id)
) 
WITHOUT OIDS;
--

CREATE OR REPLACE VIEW vw_t1 AS 
 SELECT t1.id, t1.capt
   FROM t1;
--

ALTER TABLE vw_t1 ALTER COLUMN id SET DEFAULT nextval('t1_id_seq'::regclass);
--

CREATE OR REPLACE RULE "_INSERT" AS
    ON INSERT TO vw_t1 DO INSTEAD  INSERT INTO t1 (id, capt) 
  VALUES (new.id, new.capt);
--
-- тестируем--
INSERT INTO vw_t1( capt) 
  VALUES ( 1 );
--

INSERT INTO vw_t1(id, capt) 
  VALUES ( 10 , 1 );
--
...
Рейтинг: 0 / 0
Транзакции и правило на Insert
    #34208435
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У как оно всё ...... хитро :-)
За ответ спасибо, хоть и не я спрашивал, но все равно - однозначно, в мемориз!!!
А в документации где нибудь этот момент (alter table на view) освещен?
...
Рейтинг: 0 / 0
Транзакции и правило на Insert
    #34208520
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JelisА в документации где нибудь этот момент (alter table на view) освещен?
дока по ALTER TABLE
....
SET/DROP DEFAULT
These forms set or remove the default value for a column. The default values only apply to subsequent INSERT commands; they do not cause rows already in the table to change. Defaults may also be created for views, in which case they are inserted into INSERT statements on the view before the view's ON INSERT rule is applied.
большего я не нашел. Видимо, раз этот пассаж отностится к доке по ALTER TABLE, то разработчики документации сочли это достаточно однозначным.
я же до того, что вместо ALTER VIEW надо писать ALTER TABLE как-то докопался методом тыка.
...
Рейтинг: 0 / 0
Транзакции и правило на Insert
    #34209292
vald2006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транзакции и правило на Insert
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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