Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / изменение таблиц внутри триггера / 2 сообщений из 2, страница 1 из 1
29.09.2008, 20:00
    #35566243
Драга
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
изменение таблиц внутри триггера
Посоветуйте как делать, либо что почитать.

ситуация такая:
Есть работающая система, переделать которую в корне невозможно, можно лишь делать дописки, не затрагивающие сильно саму основу.
Есть таблица, в которой храняться отчетные периоды, там собственно несколько полей всего интересны, дата этого отчетного периода (начало месяца), начальное сальдо, сумма платежей, сумма начислений.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE accounting
(
  id int8 NOT NULL DEFAULT nextval('accounting_id_seq'::regclass),
  bdate date NOT NULL,
  edate date NOT NULL,
  begin_sum numeric( 10 , 2 ) NOT NULL DEFAULT  0 ,
  payments_sum numeric( 10 , 2 ) NOT NULL DEFAULT  0 ,
  charges_sum numeric( 10 , 2 ) NOT NULL DEFAULT  0 ,
  CONSTRAINT accounting_pkey PRIMARY KEY (id),
)


Сейчас понадобилось хранить начальное сальдо (если отрицательное) в разрезе типов начислений. Предложение было следующее, создать доп.таблицу,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE accounting_charges
(
  accountingid int8 NOT NULL,
  charges_type int8,
  sum numeric( 10 , 2 ) NOT NULL DEFAULT  0 ,
  CONSTRAINT accounting_charges_pkey PRIMARY KEY (id),
  CONSTRAINT "$1" FOREIGN KEY (accountingid) REFERENCES accounting (id) ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "$2" FOREIGN KEY (charges_type) REFERENCES charges_type (id) ON UPDATE CASCADE ON DELETE SET NULL
) 

в которой собственно и хранить начальное сальдо в разрезе... всю логику по синхронизации повесить на триггеры первой таблицы.

Код: plaintext
1.
2.
3.
4.
CREATE TRIGGER onupdate_accounting
  AFTER UPDATE
  ON accounting
  FOR EACH ROW
  EXECUTE PROCEDURE trg_onupdate_accounting();

вот собственно триггер и кусок кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DELETE FROM accounting_charges      
      WHERE accountingid=_nextaccountingid;

      тут логика.. и внутри цикла 
          SELECT ...
             FROM accounting_charges
             WHERE ....


          INSERT INTO accounting_charges (accountingid,charges_type,sum)
            VALUES (_nextaccountingid,_charges_type,_sum);


суть - при изменении движения средств в текущем периоде заново сформировать весь набор остатков в следующем периоде.

так вот, не корректно работает. при большой истории, при попытке изменить где-нибудь в самом начале не правильно считает сумму.
причем суммы все время разные, при попытке проводке/удалении в первом отчетном периоде.

у меня подозрение, что из-за последовательности DELETE, SELECT, INSERT в одной таблице в пределах одного триггера, да еще и каскадного запуска, когда изменения в первом отчетном периоде влияют на остакти в последующем и т.д.

что можно сделать/почитать по этому поводу?
...
Рейтинг: 0 / 0
30.09.2008, 13:44
    #35567521
Драга
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
изменение таблиц внутри триггера
Разобрался, дело оказалось в последовательности команд.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / изменение таблиц внутри триггера / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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