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

start [/forum/topic.php?fid=53&msg=34564545&tid=2005398]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 212ms |
| total: | 381ms |

| 0 / 0 |
