|
Триггер вставки
|
|||
---|---|---|---|
#18+
Добрый день. У меня есть триггер, который после того как добавили строку в таблицу Work, должен вставлять некоторые данные из добавленной строки в таблицу Journal. Вот изначальный код триггера (пока без условия выборки): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Но мне нужно добавить в таблицу Journal данные только в том случае, если новая строка в таблице Work имеет в столбце Ysluga=1 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
При этом триггер вроде как срабатывает, но когда я захожу в таблицу Journal , то не вижу вставленных строк. Пробовала использовать IN AUTONOMOUS TRANSACTION , но тогда при попытки вставки в таблицу Journal появляется сообщение, что вставляемый WorkID ещё не создан..... Помогите пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2021, 22:46 |
|
Триггер вставки
|
|||
---|---|---|---|
#18+
SELECT MAX+1 убирай, переходи на генераторы. И названия таблиц - WORK, JOURNAL... Ты бы их еще назвал COMMIT и TABLE. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2021, 22:53 |
|
Триггер вставки
|
|||
---|---|---|---|
#18+
pirab41 когда я захожу в таблицу Journal , то не вижу вставленных строк А был ли commit? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 03:28 |
|
Триггер вставки
|
|||
---|---|---|---|
#18+
pirab41, Приведите пожалуйста DDL таблиц, версию ЖП и параметры транзакции. P.S. Экстрасенсы в другом форуме. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 05:02 |
|
Триггер вставки
|
|||
---|---|---|---|
#18+
Если JournalID это первичный ключ в таблице Journal то принципиально неправильно сделаны 2 вещи: - получение следующего значения черех MAX()+1 - получение этого значения в триггере какой-то левой таблицы Классикой является заполнение ID в триггере той самой таблицы, в данном случае Journal , из генератора. Конструкция MAX()+1 работает в контексте транзакции и может не видеть созданную но незакоммиченную версию. Генераторы работают вне транзакции, и таких проблем не создадут. Таким образом привставке записи в Journal значение поля JournalID вообще не нужно указывать - оно подставится автоматически. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Соответственно триггер на Work будет выглядеть как-то так Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Пробовала использовать IN AUTONOMOUS TRANSACTION , но тогда при попытки вставки в таблицу Journal появляется сообщение, что вставляемый WorkID ещё не создан..... Из приведенного вами DDL я не понял что может вызвать такое сообщение. Сообщения лучше приводить в оригинале, а не "в пересказе Рабиновича". И да, как тут уже говорили, невидимость записи в Journal скорее всего потому что запись незакоммичена, или читающая транзакция такого типа что ее требуется перезапустить. В случае с получением значения JournalID из генератора - факт вставки записи (косвенно, конечно) можно проверить глянув на текущее значение генератора. Генератор виден без транзакций - если значение поменялось, значит его дергали. Если место где его дергают - только в триггере Journal_AI - значит вставка в журнал была. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 05:37 |
|
Триггер вставки
|
|||
---|---|---|---|
#18+
fraks, Спасибо большое за помощь! Разобрался ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 09:46 |
|
Триггер вставки
|
|||
---|---|---|---|
#18+
pirab41, Тут правильно пишут, что вместо MAX+1 надо использовать генератор. Но, если уж используется, то надо учитывать, что записей в таблице JournalFly может не быть, тогда будет ошибка Надо так: Код: sql 1.
MAX - это не COUNT. При пустом наборе он возвращает NULL ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2021, 10:20 |
|
|
start [/forum/topic.php?fid=40&fpage=7&tid=1560066]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
169ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 287ms |
0 / 0 |