Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обуздать триггер, Или найти иное решение / 4 сообщений из 4, страница 1 из 1
31.05.2007, 12:23
    #34564126
Paramedic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обуздать триггер, Или найти иное решение
Здравствуйте.

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

CREATE TABLE t1 (
"sum_field" NUMERIC
);

Имеется иная табличка.

CREATE TABLE t2 (
"proc" NUMERIC,
"sum_loc" NUMERIC
);

В ней имеются два поля, в одном проценты (t2.proc), сколько нужно от этой суммы (table1.sum_field) откусить, а в другом (t2.sum_loc) -- сколько это получается в рублях. Примечание: новая порция денег не замещает собой значение t2.sum_loc, а прибавляется к нему.

Как самое простое решение, написал я триггер, на before insert/update, который берёт и раскидывает t1.sum_field по t2.sum_loc, в соответствии с t2.proc.

Да вот беда, когда из t2.sum_loc что-то берут, то это что-то вычитают из t1.sum_field.

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

Варианты решений:
1. Отключить триггер на время вычитания. Но что-то я не нашёл способа сделать триггер неактивным.

2. При входе в функцию триггера сообразить, что ничего делать не нужно. Но вот как это реализовать? Можно попробовать через функции current_setting и set_config из секции System Administration Functions.

3. Отказаться от триггера, и найти иное решение. Например, написать хранимку, которая будет изменять t1.sum_field и следом менять значения во второй таблице

Вопросы:
можно ли отключить триггер?
можно ли в функции триггера понять, откуда его вызывают
или пойти другим путём?
...
Рейтинг: 0 / 0
31.05.2007, 12:45
    #34564240
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обуздать триггер, Или найти иное решение
Как вариант, смотреть - прибавляют или отнимают из Т1, и дальше отрабатывать триггер или выходить.
Но я бы сделал две функции, одна добавляет, другая вычитает.
...
Рейтинг: 0 / 0
31.05.2007, 12:50
    #34564261
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обуздать триггер, Или найти иное решение
Ну, если сумма в т1 от пользователя только увеличивается, а триггерно столько уменьшается - то можно сделать разделение по знаку разности new и old значений.
Т.е. на т1:
1. Сумма увеличилась - переколбашиваем проценты в "+".
2. Сумма уменьшилась - абламываемся че-то менять.
На т2:
1. Сумма увеличилась - паднимаем сумму процентов
2. Сумма уменьшилась - уменьшаем сумму в т1.

триггера можно отключать
ALTER TABLE .

Мне че-то кажется что задача сложнее на самом деле и есть или просчет проектирования, или что-то в этом роде. Можно сделать функцию, которую вызывать в случае необходимости, и в функции все делать.
...
Рейтинг: 0 / 0
31.05.2007, 13:40
    #34564545
Paramedic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обуздать триггер, Или найти иное решение
Да, действительно, сравнение OLD < NEW, вполне решает проблему. И как это я сам не догадался?
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обуздать триггер, Или найти иное решение / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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