|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL Даже количество вовлеченных строчек неизвестно А зачем оно в триггере? Вне его есть sql%rowcount. Зачем в триггере что-то знать про вставляемые данные? :) На то он и триггер. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:22 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLЕсли я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на уровне оператора пройтись по списку? Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр. Назовите таблицу, в которую будете вставлять вставленные строки, INSERTED и внезапно паззл сложится. Очень смешно. Это даст все строки, а не новые. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:23 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:26 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Похоже, я царапнул часть, где у Оракла есть недоделки. ORA-25002: cannot create INSTEAD OF triggers on tables "Почему?" - "Не положено! Невозможно, несовместимо с теорией множеств и принципам СУБД!" "А если я оберну эту таблицу в представление, тогда можно?" - "Ну, тогда да". 8-I ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:27 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Dimitry Sibiryakov пропущено... Назовите таблицу, в которую будете вставлять вставленные строки, INSERTED и внезапно паззл сложится. Очень смешно. Это даст все строки, а не новые. в строчном триггере вставляете строки в "INSERTED", в операторном обрабатываете так возможно делать не надо, ето я токо для примера ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:29 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Staxнасчет :new, смеритесь нет (возможно пока) в оракля new типа "record" А параметр процедуры этого типа есть? Я честно не в курсе... есть. через определение subtype: Код: plsql 1.
PS1 а про составные (compaund) триггеры топикстартер так и не нашел времени почитать. PS2 мало жести. Что за скука такая - "логирование из триггера". Давай почту отправлять, что-ли, в конце-то концов. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:30 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL, ты шипучки сегодня много перепил. Клоун, ты надоел, сними колпак. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:31 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Похоже, я царапнул часть, где у Оракла есть недоделки. ORA-25002: cannot create INSTEAD OF triggers on tables "Почему?" - "Не положено! Невозможно, несовместимо с теорией множеств и принципам СУБД!" "А если я оберну эту таблицу в представление, тогда можно?" - "Ну, тогда да". 8-I конешно, напр навесьте обычный триггер на вью ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:43 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
booby а про составные (compaund) триггеры топикстартер так и не нашел времени почитать. особенно compaund и мерже .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:45 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Stax, если ты про глобальные переменные уровня триггера - пакетных переменных вроде ещё никто не отменял. А так да, баг. Но это милый, обходимый баг. instead of триггер и без багов убъёт... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 19:05 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Stax НеофитSQL пропущено... Очень смешно. Это даст все строки, а не новые. в строчном триггере вставляете строки в "INSERTED", в операторном обрабатываете так возможно делать не надо, ето я токо для примера ..... stax Согласен, не надо таблицу заводить, где списак ID хватило бы, Думаю что есть решение проще, чем через кампаунд триггер собирать ID, потом их обрабатывать: - в таблице есть ID, который монотонно растет. Если знать максимальный ID до Insert, легко извлекаются все строчки из statement-level триггера. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
MaxIDbeforeInsert - это функция которая научилась подглядывать max(tst.id) до вставки/коммита новых строк при вызове из после-триггера. Проверил - работает как ожидается. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 19:48 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Собственно, решение первоначального вопроса: БЫЛО: Код: plsql 1. 2. 3. 4. 5. 6.
СТАЛО: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 19:53 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Если знать максимальный ID до Insert, легко извлекаются все строчки из statement-level триггера. Блин, ну кода уже перестанете фантазировать и начнете чтить доку.... Не работает этот "метод" в многопользовательской среде, не-ра-бо-та-ет. Потому единственный вариант сделать Ваш метод надежным - блокировать таблицу с целью сериализации транзакций. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 20:40 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
andrey_anonymous НеофитSQL Если знать максимальный ID до Insert, легко извлекаются все строчки из statement-level триггера. Блин, ну кода уже перестанете фантазировать и начнете чтить доку.... Не работает этот "метод" в многопользовательской среде, не-ра-бо-та-ет. Потому единственный вариант сделать Ваш метод надежным - блокировать таблицу с целью сериализации транзакций. В таблицу импорта событий пишет один пользователь, больше никто. Единственная операция - insert(1line)/commit, поэтому триггер будет вызываться строго сериализованно. Я понимаю что в если бы в таблицу событий писали несколько и одновременно, то был бы шанс увидеть некоторые из новых событий повторно. Но это не тот случай, у каждого потока событий своя таблица импорта. Жаль, что я не знаю другого удобного способа пуш-передачи событий в Оракл, какие-нибудь встроенные уведомления или сообщения были бы в самый раз.. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 21:00 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQLЖаль, что я не знаю другого удобного способа пуш-передачи событий в Оракл, какие-нибудь встроенные уведомления или сообщения были бы в самый раз.. Тебе уже два раза сказали про Database Change Notification. И я ещё добавлю про Advanced Queueing и её меньшего брата Publish-Subscribe. С какого раза до тебя дойдёт, что без чтения документации ты так и будешь тыкаться слепым кутёнком во все розетки?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 21:09 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Да прикольно же Чувак думает, что он очень умный и заточил бы все намного лучше, а причина кривых решений всего лишь совместимость с legacy кодом и тупизна разработчиков (как во время разработки, так и сейчас) Уже не раз сказали про разницу между версионником и блокировочником и многопользовательскую работу. Но, поскольку опыта нет -- делаются какие-то дикие умозаключения. 2Аффтар: Вот, кстати, тоже интересный пример многопользовательской работы, когда строчный before триггер срабатывает несколько раз вместо одного. Можешь подумать/погуглить почему так происходит (про миниоткаты/рестарты уже намекали) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 02:12 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLЖаль, что я не знаю другого удобного способа пуш-передачи событий в Оракл, какие-нибудь встроенные уведомления или сообщения были бы в самый раз.. Тебе уже два раза сказали про Database Change Notification... (вздох) Вы уже два раза вход с выходом перепутали. События идут *в* базу. Сегодня - через таблицу импорта, триггеры срабатывают на появлении новой строки. Удобно, работает, но наверное есть методы лучше если кто-то разбирается. Поллинг не предлагать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 02:52 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Я так понимаю, "хотя бы бегло ознакомиться что такое Database Change Notification" тоже не предлагать ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 02:56 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Да прикольно же 2Аффтар: Вот, кстати, тоже интересный пример многопользовательской работы, когда строчный before триггер срабатывает несколько раз вместо одного. Можешь подумать/погуглить почему так происходит (про миниоткаты/рестарты уже намекали) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
Действительно интересно. Сам не догадался, но спасибо Гуглу, теперь понимаю почему триггер вызвался более трех раз: В таблицу одновременно пишут более одного пользователя. ОК, многопользовательский режим, рестарты, там свои погремушки. Я специально спроектировал импорт событий с одним писателем, чтобы все было просто и удобно, особенно для меня. insert 1 line /commit; -- одно событие, пришла новая строка insert 1 line /commit; -- через минуту еще событие, еще строка insert 1 line /commit; -- и так много полезных событий, которые надо обработать ... А в триггере события читаю. Эксепшн обрабатываю, каждый insert/commit успешный. И теперь уже без некрасивого присваивания столбцов по одному, с чего и начиналась эта тема. Наверное можно было и посложнее что-то замутить, чтоб было что отлаживать. Чтоб все события из разных источников в одну таблицу ломились из разных сессий, и чтоб обработчик событий тоже туда писал, и обработку ошибок через эксепшн - пусть внешний скрипт ловит. Одновременно чистить таблицу из джоба от старых данных, переставляя строки... :) Я так жонглировать пока не умею, поэтому сделал просто, уже закончил протестировал и сдал. Впереди другие задачи, непохожие на все предыдущие, и в этот раз хуже чем обработка событий - мой код должен управлять финансовыми расходами и действиями людей, но ТЗ очень сырое. Не хочется обнаруживать ошибки в ТЗ, потратив напрасно тысячи долларов, да и модель "машина говорит человеку что делать дальше" выглядит перевернутой. Так делает амазон, и работники снабжения там несчастны из-за этого. Сейчас думаю, как вернуть в эту новую задачу человеческое звено. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 03:30 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Я так понимаю, "хотя бы бегло ознакомиться что такое Database Change Notification" тоже не предлагать Возможно, я что-то пропустил, когда читал про это. Рассматривал использование этого механизма для уведомления клиентов (терминалы) об изменении в адресной книге на сервере, поэтому запомнил что это уведомление от сервера к клиенту. Если он может работать в другую сторону, я об этом очевидно не знал. Посмотрев на сетап такого механизма, он в разы более трудоемкий чем stateless insert/commit который я могу исполнить хоть из шелла, хоть из аутлука. Начинаю думать, что передача низкочастотных сообщений через insert-only таблицы был выбран удачно, возможно оптимально для моих целей. От (пока недолгих) вычислений в импорт-триггере я не в восторге; что именно меня смущает, пока не могу сказать. Может, синхронная привязка к импорту, выглядит неэффективно. Для событий частотой в 0.02 герц должно работать без проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 03:48 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL чтобы все было просто и удобно, особенно для меня ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 06:54 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Для событий частотой в 0.02 герц должно работать без проблем. не совсем. https://docs.oracle.com/cd/E11882_01/server.112/e22490/ldr_modes.htm#SUTIL1335 Database Insert Triggers Table insert triggers are also disabled when a direct path load begins. After the rows are loaded and indexes rebuilt, any triggers that were disabled are automatically reenabled. The log file lists all triggers that were disabled for the load. There should not be any errors reenabling triggers. Unlike integrity constraints, insert triggers are not reapplied to the whole table when they are enabled. As a result, insert triggers do not fire for any rows loaded on the direct path. When using the direct path, the application must ensure that any behavior associated with insert triggers is carried out for the new rows. завтра поменяется логика вставки в вашу таблицу, и привет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 08:14 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL, Искренне жаль тех, кому придётся потом это сопровождать. Они не будут знать умозаключений про 0.2 герца, гарантию однопользовательской работы и т.п. Зато будут совершенно искренне материть "умника", влепившего > priorMaxId в триггер, когда наконец докопаются до источника ошибки. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 09:21 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env, Да не будет никто у них это сопровождать... Либо контора окончательно разорится, либо купят нормальный биллинг... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 10:54 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
кит северных морей НеофитSQL Для событий частотой в 0.02 герц должно работать без проблем. не совсем. https://docs.oracle.com/cd/E11882_01/server.112/e22490/ldr_modes.htm#SUTIL1335 Database Insert Triggers Table insert triggers are also disabled when a direct path load begins. After the rows are loaded and indexes rebuilt, any triggers that were disabled are automatically reenabled. The log file lists all triggers that were disabled for the load. There should not be any errors reenabling triggers. Unlike integrity constraints, insert triggers are not reapplied to the whole table when they are enabled. As a result, insert triggers do not fire for any rows loaded on the direct path. When using the direct path, the application must ensure that any behavior associated with insert triggers is carried out for the new rows. завтра поменяется логика вставки в вашу таблицу, и привет. Кит, я не знал о названии direct load, это используется при backup/restore? Логично что в особых ситуациях для "старых" данных триггеры не вызовутся заново. В моем случае, попытка вогнать новые данные без insert триггеров потерпит неудачу, т.к. до-триггер проставляет PK в non-nullable колонку. Спасибо за комментарий, у меня как раз есть одна таблица на 1М строчек (справочник, без триггеров), которую было бы быстрее загрузить через Direct Load. Попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 16:24 |
|
|
start [/forum/topic.php?fid=52&msg=40010004&tid=1880777]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 308ms |
total: | 553ms |
0 / 0 |