Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Триггер
|
|||
|---|---|---|---|
|
#18+
Есть таблица 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 записей. Помогите, пожалуйста, разобраться в чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 11:32 |
|
||
|
Триггер
|
|||
|---|---|---|---|
|
#18+
В триггере можно инициировать вызов той же триггерной процедуры. Т.е. в триггере на удаление делать апдейт других записей той же таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 16:11 |
|
||
|
Триггер
|
|||
|---|---|---|---|
|
#18+
Наверно надо DELETE тригер повесить на AFTER и FOR EACH STATEMENT. P.S. И когда стока кода постите, используйте [ SRC ], а то ведь не понятно ни чего :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 17:23 |
|
||
|
Триггер
|
|||
|---|---|---|---|
|
#18+
JelisНаверно надо DELETE тригер повесить на AFTER и FOR EACH STATEMENT. P.S. И когда стока кода постите, используйте [ SRC ], а то ведь не понятно ни чего :-) Да не. Проблемма решилась гораздо проще. Вынес средние значения каждой проводки в отдельную таблицу и поэтому при удалении проводки, когда происходит апдейт (пересчет средних значений) не происходит инициирования той же триггерной процедуры, потому как нет апдейта той же самой таблицы . И все заработало правильно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2006, 19:40 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34101832&tid=2005990]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
137ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 416ms |

| 0 / 0 |
