Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
31.05.2007, 12:23
|
|||
|---|---|---|---|
|
|||
Обуздать триггер, Или найти иное решение |
|||
|
#18+
Здравствуйте. Следующая ситуация (упрощённая, для наглядности): имеется запись, с полем, в котором лежит денежная сумма. Всё это лежит в одной табличке. 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 и следом менять значения во второй таблице Вопросы: можно ли отключить триггер? можно ли в функции триггера понять, откуда его вызывают или пойти другим путём? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.05.2007, 12:45
|
|||
|---|---|---|---|
|
|||
Обуздать триггер, Или найти иное решение |
|||
|
#18+
Как вариант, смотреть - прибавляют или отнимают из Т1, и дальше отрабатывать триггер или выходить. Но я бы сделал две функции, одна добавляет, другая вычитает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.05.2007, 12:50
|
|||
|---|---|---|---|
|
|||
Обуздать триггер, Или найти иное решение |
|||
|
#18+
Ну, если сумма в т1 от пользователя только увеличивается, а триггерно столько уменьшается - то можно сделать разделение по знаку разности new и old значений. Т.е. на т1: 1. Сумма увеличилась - переколбашиваем проценты в "+". 2. Сумма уменьшилась - абламываемся че-то менять. На т2: 1. Сумма увеличилась - паднимаем сумму процентов 2. Сумма уменьшилась - уменьшаем сумму в т1. триггера можно отключать ALTER TABLE . Мне че-то кажется что задача сложнее на самом деле и есть или просчет проектирования, или что-то в этом роде. Можно сделать функцию, которую вызывать в случае необходимости, и в функции все делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=53&mobile=1&tid=2005398]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 235ms |
| total: | 398ms |

| 0 / 0 |
