powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Каскадное удаление
15 сообщений из 15, страница 1 из 1
Каскадное удаление
    #34329750
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE ex_pit_transactions
(
  id bigserial NOT NULL,
  bid int4 NOT NULL,
  fma text NOT NULL,
  volume numeric( 30 , 3 ) NOT NULL,
  cur_id int4 NOT NULL,
  ts timestamp NOT NULL DEFAULT now(),
  comments char( 255 ),
  dat date NOT NULL DEFAULT ('now'::text)::date,
  tm time NOT NULL DEFAULT ('now'::text)::time with time zone,
  cnt int4 NOT NULL,
  sid int4 NOT NULL,
  op_type int4 NOT NULL,
  confirm bool NOT NULL DEFAULT false,
  CONSTRAINT ex_pit_transactions_id_pkey PRIMARY KEY (id)
) 
WITH OIDS;
и
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE commission_ex_pit_tran
(
  id_tran int8 NOT NULL, -- ид ручной (внебиржевой) проводки
  volume numeric( 30 , 4 ) NOT NULL, -- сумма комиссионной проводки
  ts timestamp NOT NULL DEFAULT now(), -- время добавления записи в таблицу
  comments char( 255 ), -- комментарий комиссионной проводки
  c_type int2 NOT NULL, -- тип комиссионной проводки: 1-комиссия брокера, 2- комиссия торговой системы
  CONSTRAINT commission_ex_pit_tran_id_tran_fkey FOREIGN KEY (id_tran)
      REFERENCES ex_pit_transactions (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT commission_ex_pit_tran_unique2_key UNIQUE (id_tran, c_type)
) 
WITH OIDS;
Перед удалением записи в таблице commission_ex_pit_tran срабатывает триггер
Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER commission_ex_pit_tran_trig_before
  BEFORE DELETE
  ON commission_ex_pit_tran
  FOR EACH ROW
  EXECUTE PROCEDURE recalc_money_balance();

При удалении записи из таблицы ex_pit_transactions удаляются соответствующие записи в таблице commission_ex_pit_tran, что вызывает срабатывание триггерной процедуры recalc_money_balance(). Но в контексте этой процедуры уже нет записи в таблице ex_pit_transactions. Можно как-нибудь добиться , что бы в контексте процедуры recalc_money_balance() запись в таблице ex_pit_transactions еще была?
...
Рейтинг: 0 / 0
Каскадное удаление
    #34329793
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msa@n-e.ruЕсть две таблицы:
...
Перед удалением записи в таблице commission_ex_pit_tran срабатывает триггер
Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER commission_ex_pit_tran_trig_before
  BEFORE DELETE
  ON commission_ex_pit_tran
  FOR EACH ROW
  EXECUTE PROCEDURE recalc_money_balance();

При удалении записи из таблицы ex_pit_transactions удаляются соответствующие записи в таблице commission_ex_pit_tran, что вызывает срабатывание триггерной процедуры recalc_money_balance(). Но в контексте этой процедуры уже нет записи в таблице ex_pit_transactions. Можно как-нибудь добиться , что бы в контексте процедуры recalc_money_balance() запись в таблице ex_pit_transactions еще была?

В принципе - это один из спорных моментов в СУБД в принципе. И в разных СУБД реализован по разному, от мутаций Оракла до дедлоков в какой-то из фриварных. Я где-то с год назад бросал в рассылку Постгреса багу (точнее не соответсвие SQL стандарту) на схожую тему. Но, то ли мой аглицкий не силен, или просто no comments.

Я бы посоветовал удаляемые записи из ex_pit_transactions вносить в времянку, и потом уже анализировать в recalc_money_balance().
...
Рейтинг: 0 / 0
Каскадное удаление
    #34329868
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, если другого способа нет, то придется :-(
...
Рейтинг: 0 / 0
Каскадное удаление
    #34329890
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey Daeron msa@n-e.ruЕсть две таблицы:
...
Перед удалением записи в таблице commission_ex_pit_tran срабатывает триггер
Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER commission_ex_pit_tran_trig_before
  BEFORE DELETE
  ON commission_ex_pit_tran
  FOR EACH ROW
  EXECUTE PROCEDURE recalc_money_balance();

При удалении записи из таблицы ex_pit_transactions удаляются соответствующие записи в таблице commission_ex_pit_tran, что вызывает срабатывание триггерной процедуры recalc_money_balance(). Но в контексте этой процедуры уже нет записи в таблице ex_pit_transactions. Можно как-нибудь добиться , что бы в контексте процедуры recalc_money_balance() запись в таблице ex_pit_transactions еще была?

В принципе - это один из спорных моментов в СУБД в принципе. И в разных СУБД реализован по разному, от мутаций Оракла до дедлоков в какой-то из фриварных. Я где-то с год назад бросал в рассылку Постгреса багу (точнее не соответсвие SQL стандарту) на схожую тему. Но, то ли мой аглицкий не силен, или просто no comments.

Я бы посоветовал удаляемые записи из ex_pit_transactions вносить в времянку, и потом уже анализировать в recalc_money_balance().

Вообще, конечно, странно почему перед удалением записи в дочерней таблице в родительской уже нет записи. А параметры первичного/вторичного ключей типа deferrable не помогут?
...
Рейтинг: 0 / 0
Каскадное удаление
    #34330090
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно попробовать так... Убрать cascade на ex_pit_transactions и сделать либо представление с rule, либо просто для таблицы rule на удаление, в котором сначала удалять запись из commission_ex_pit_tran а уже потом из ex_pit_transactions.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    CREATE RULE ex_pit_transactions_Delete AS ON DELETE TO ex_pit_transactions
    DO INSTEAD
    (
        DELETE FROM commission_ex_pit_tran WHERE id_tran = OLD.id;
        DELETE FROM ex_pit_transactions WHERE id = OLD.old;
    );

...
Рейтинг: 0 / 0
Каскадное удаление
    #34330153
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JelisМожно попробовать так... Убрать cascade на ex_pit_transactions и сделать либо представление с rule, либо просто для таблицы rule на удаление, в котором сначала удалять запись из commission_ex_pit_tran а уже потом из ex_pit_transactions.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    CREATE RULE ex_pit_transactions_Delete AS ON DELETE TO ex_pit_transactions
    DO INSTEAD
    (
        DELETE FROM commission_ex_pit_tran WHERE id_tran = OLD.id;
        DELETE FROM ex_pit_transactions WHERE id = OLD.old;
    );



А рекурсии тут не будет?
...
Рейтинг: 0 / 0
Каскадное удаление
    #34330166
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msa@n-e.ru JelisМожно попробовать так... Убрать cascade на ex_pit_transactions и сделать либо представление с rule, либо просто для таблицы rule на удаление, в котором сначала удалять запись из commission_ex_pit_tran а уже потом из ex_pit_transactions.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    CREATE RULE ex_pit_transactions_Delete AS ON DELETE TO ex_pit_transactions
    DO INSTEAD
    (
        DELETE FROM commission_ex_pit_tran WHERE id_tran = OLD.id;
        DELETE FROM ex_pit_transactions WHERE id = OLD.old;
    );



А рекурсии тут не будет?

А от куда? У вас что ли в триггере на commission_ex_pit_tran удаляються записи из commission_ex_pit_tran?
...
Рейтинг: 0 / 0
Каскадное удаление
    #34330175
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jelis msa@n-e.ru JelisМожно попробовать так... Убрать cascade на ex_pit_transactions и сделать либо представление с rule, либо просто для таблицы rule на удаление, в котором сначала удалять запись из commission_ex_pit_tran а уже потом из ex_pit_transactions.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    CREATE RULE ex_pit_transactions_Delete AS ON DELETE TO ex_pit_transactions
    DO INSTEAD
    (
        DELETE FROM commission_ex_pit_tran WHERE id_tran = OLD.id;
        DELETE FROM ex_pit_transactions WHERE id = OLD.old;
    );



А рекурсии тут не будет?

А от куда? У вас что ли в триггере на commission_ex_pit_tran удаляються записи из commission_ex_pit_tran?

Нет! У меня в триггере ничего не удаляется, а вот у вас в правиле на удаление идет удаление из этой же таблицы! Это не рекурсия разве?
...
Рейтинг: 0 / 0
Каскадное удаление
    #34330189
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jelis msa@n-e.ru JelisМожно попробовать так... Убрать cascade на ex_pit_transactions и сделать либо представление с rule, либо просто для таблицы rule на удаление, в котором сначала удалять запись из commission_ex_pit_tran а уже потом из ex_pit_transactions.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    CREATE RULE ex_pit_transactions_Delete AS ON DELETE TO ex_pit_transactions
    DO INSTEAD
    (
        DELETE FROM commission_ex_pit_tran WHERE id_tran = OLD.id;
        DELETE FROM ex_pit_transactions WHERE id = OLD.old;
    );



А рекурсии тут не будет?

А от куда? У вас что ли в триггере на commission_ex_pit_tran удаляються записи из commission_ex_pit_tran?
А... немного описался...
У вас что ли в триггере на commission_ex_pit_tran удаляються записи из ex_pit_transactions?
...
Рейтинг: 0 / 0
Каскадное удаление
    #34330205
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jelis Jelis msa@n-e.ru JelisМожно попробовать так... Убрать cascade на ex_pit_transactions и сделать либо представление с rule, либо просто для таблицы rule на удаление, в котором сначала удалять запись из commission_ex_pit_tran а уже потом из ex_pit_transactions.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    CREATE RULE ex_pit_transactions_Delete AS ON DELETE TO ex_pit_transactions
    DO INSTEAD
    (
        DELETE FROM commission_ex_pit_tran WHERE id_tran = OLD.id;
        DELETE FROM ex_pit_transactions WHERE id = OLD.old;
    );



А рекурсии тут не будет?

А от куда? У вас что ли в триггере на commission_ex_pit_tran удаляються записи из commission_ex_pit_tran?
А... немного описался...
У вас что ли в триггере на commission_ex_pit_tran удаляються записи из ex_pit_transactions?

Да нет же! Ни в одном из триггеров ничего не удаляется. У вас в правиле на удаление делается удаление из той же таблицы! Постгрес ругается
ERROR: обнаружена бесконечная рекурсия в правилах для отношения "ex_pit_transactions" пр и выполнении запроса delete from ex_pit_transactions where id=46
...
Рейтинг: 0 / 0
Каскадное удаление
    #34330225
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Меня спасло правило
Код: plaintext
1.
2.
3.
CREATE OR REPLACE RULE ex_pit_transactions_del AS
    ON DELETE TO ex_pit_transactions DO  DELETE FROM commission_ex_pit_tran
  WHERE commission_ex_pit_tran.id_tran = old.id;

В этом случае, он сначало выполняет удаление из commission_ex_pit_tran, а уже потом из ex_pit_transactions !
...
Рейтинг: 0 / 0
Каскадное удаление
    #34330235
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вам, Jelis , отдельное спасибо за подсказку :-)
...
Рейтинг: 0 / 0
Каскадное удаление
    #34330469
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msa@n-e.ruДа нет же! Ни в одном из триггеров ничего не удаляется. У вас в правиле на удаление делается удаление из той же таблицы! Постгрес ругается
ERROR: обнаружена бесконечная рекурсия в правилах для отношения "ex_pit_transactions" пр и выполнении запроса delete from ex_pit_transactions where id=46
В самом деле ругаеться.... Просто я обычно рулесы на представления создаю, а таблицы оставляю "чистыми", и с представлениями, понятное дело, таких проблемм нет.

msa@n-e.ru
Вам, Jelis , отдельное спасибо за подсказку :-)

Наздоровье :-)
...
Рейтинг: 0 / 0
Каскадное удаление
    #34332555
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как известно, пк, чеки и фк в постгре есть "попросту" CONSTRAINT TRIGGER-а. (на сишных триггерных ф-ях) т.ч.видимо там собака порылась
читаем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Name
CREATE CONSTRAINT TRIGGER — define a new constraint trigger

Synopsis
CREATE CONSTRAINT TRIGGER name
    AFTER events ON
    tablename constraint attributes
    FOR EACH ROW EXECUTE PROCEDURE funcname ( args )
Description
CREATE CONSTRAINT TRIGGER is used within CREATE TABLE/ALTER TABLE and by pg_dump to create the special triggers for referential integrity. It is not intended for general use. 

Parameters
как-то в этом тексте не видать волатильности в задании BEFORE/AFTER.
т.ч. видимо это надо принять как данность
...
Рейтинг: 0 / 0
Каскадное удаление
    #34552245
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вообще сделать это удаление?
С чего начинать?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Каскадное удаление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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