powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггер
4 сообщений из 4, страница 1 из 1
Триггер
    #34100113
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица

CREATE TABLE broker_fund_corr_op
(
bma_id int4 NOT NULL, -- ид счета брокера в системе
fma_id int4 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, -- дата проводки (дата заявки из таблицы сырых сделок)
request_num int8 NOT NULL, -- номер заявки из таблицы сырых сделок
cnt int4 NOT NULL, -- кол-во бумаг
sid int4 NOT NULL, -- ид бумаги в системе
op_type int4 NOT NULL, -- тип опреации (покупка или продажа), 1-покупка, 2-продажа
prev_avg_sec_price numeric NOT NULL DEFAULT 0, -- предыдущее среднее значение цены одной бумаги
CONSTRAINT broker_fund_corr_op_bma_id_fkey FOREIGN KEY (bma_id)
REFERENCES broker_money_acc (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT broker_fund_corr_op_cur_id_fkey FOREIGN KEY (cur_id)
REFERENCES currency (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT broker_fund_corr_op_fma_id_fkey FOREIGN KEY (fma_id)
REFERENCES fund_money_acc (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT broker_fund_corr_op_sid_fkey FOREIGN KEY (sid)
REFERENCES securities (sid) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT broker_fund_corr_op_dat_request_num_unique_key UNIQUE (dat, request_num)
)
WITH OIDS;

с триггером

CREATE TRIGGER recalc_balance
BEFORE INSERT OR UPDATE OR DELETE
ON broker_fund_corr_op
FOR EACH ROW
EXECUTE PROCEDURE recalc_broker_fund_balance();

коротый при добавлении , удалении, обновлении пересчитывает остатки там всякие

CREATE OR REPLACE FUNCTION recalc_broker_fund_balance()
RETURNS "trigger" AS
$BODY$DECLARE
--тут всякие переменные
BEGIN
IF TG_OP='INSERT' THEN
--тут пересчет остатка при добавлении проводки
RETURN NEW;
ELSIF TG_OP='DELETE' THEN
--тут пересчет остатка при удалении проводки
--и еще нужно выполнить апдейт ряда записей этой же таблицы при удалении записи (пересчет там всяких средних значений в цикле ) (удаляемая запись не апдейтится)
FOR curr_op IN SELECT .....и т.д. LOOP
UPDATE broker_fund_corr_op SET prev_avg_sec_price=curr_avg WHERE dat=curr_op.dat AND request_num=curr_op.request_num;
END LOOP;
RETURN OLD;
ELSIF TG_OP='UPDATE' THEN
--пересчет при апдейте должен проходить только если изменилось volume или cur_id или cnt или op_type
IF NEW.volume<>OLD.volume OR NEW.cur_id<>OLD.cur_id OR NEW.cnt<>OLD.cnt OR NEW.op_type<>OLD.op_type THEN
--тут пересчет остатка при обновлении записи
--и еще нужно выполнить апдейт ряда записей этой же таблицы при обновлении записи (пересчет там всяких средних значений в цикле ) (обновляемая запись не апдейтится)
FOR curr_op IN SELECT .... и т.д. LOOP
--апдейтим текущее среднее значение (пересчитанное)
UPDATE broker_fund_corr_op SET prev_avg_sec_price=curr_avg WHERE dat=curr_op.dat AND request_num=curr_op.request_num;
END LOOP;
RETURN NEW;
END IF;
RETURN NULL;
END;$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Так вот проблема в том, что при удалении всех записей из таблицы проводок

delete from broker_fund_corr_op;

он удаляет почему-то только 14 записей а их там 1500

если в триггере "на удаление" закомментировать апдейт той же самой таблицы
-- UPDATE broker_fund_corr_op SET prev_avg_sec_price=curr_avg WHERE dat=curr_op.dat AND request_num=curr_op.request_num;
(тот что в цикле) , удаляются все записи. Причем в первом случае при удалении только 14 -ти записей никаких ошибок не возникает. Сервер говорит, что удалено 14 записей успешно. А почему все 1500 не удалилось?

При каждом слежующем выполнении запроса

delete from broker_fund_corr_op;

удаляется еще 14 записей. Помогите, пожалуйста, разобраться в чем проблема?
...
Рейтинг: 0 / 0
Триггер
    #34101536
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В триггере можно инициировать вызов той же триггерной процедуры. Т.е. в триггере на удаление делать апдейт других записей той же таблицы?
...
Рейтинг: 0 / 0
Триггер
    #34101832
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверно надо DELETE тригер повесить на AFTER и FOR EACH STATEMENT.

P.S. И когда стока кода постите, используйте [ SRC ], а то ведь не понятно ни чего :-)
...
Рейтинг: 0 / 0
Триггер
    #34102249
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JelisНаверно надо DELETE тригер повесить на AFTER и FOR EACH STATEMENT.

P.S. И когда стока кода постите, используйте [ SRC ], а то ведь не понятно ни чего :-)

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


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