|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Для одиночного insert существует, но запрещен инженерами оракла. не инженерами оракля, а потому что таблица уже в неопределенном (мутирующим) состоянии сравните с 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. 35. 36. 37. 38. 39. 40.
так конечно делать нельзя , пример для понимания мутации разве что как защита от непонятно чего ps я не считаю триггера всемирным злом ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 09:03 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Для протоколирования действий у меня отдельная таблица, где действительно работает откат . прочитайте об автономных транзакциях, или пишите в файл (в алерт лог например) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 09:12 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
boobyЧитать у него времени нет. Триггера писать надо. Проблема не в совсем в этом, а в том, что ему лень при вызове процедуры перечислять все поля из new явно. Это же можно пальцы стереть до самых ягодиц. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 12:58 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Как это принято делать? Инкапсулировать логику работы с данными в пакетах. Dimitry Sibiryakov Проблема не в совсем в этом, а в том, что ему лень при вызове процедуры перечислять все поля из new явно. Это же можно пальцы стереть до самых ягодиц. Думаете, если он научится формировать перечисление полей запросом и узнает, что кроме позиционного указания параметров существует именованное, то проблема исчезнет? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 14:12 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Stax НеофитSQL Для протоколирования действий у меня отдельная таблица, где действительно работает откат . прочитайте об автономных транзакциях, или пишите в файл (в алерт лог например) ..... stax Спасибо, я так и делаю. Моя процедура LogError() объявлена автономной через прагму, что позволяет ей быть безоткатной. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 15:35 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
>Инкапсулировать логику работы с данными в пакетах. Это я и сделал в начале темы. Возник вопрос: как передать :new в этот пакет, кроме перечисления всех полей? Динамический SQL для копирования одной строки внутри триггера не рассматривается, это извращение. Было много рассуждений на все темы, ответа пока нет (я скоро напишу, там две строчки). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 15:58 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL, Под инкапсуляцией логики в пакетах подразумевается управление добавлением/изменением содержимого таблиц через вызов процедур, а не прикручивание пакетов к триггерам. Или у вас в базу может лазить кто угодно и править данные в любой таблице в любое время? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 16:13 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Stax НеофитSQL Для одиночного insert существует, но запрещен инженерами оракла. не инженерами оракля, а потому что таблица уже в неопределенном (мутирующим) состоянии сравните с 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. 35. 36. 37. 38. 39. 40.
так конечно делать нельзя , пример для понимания мутации разве что как защита от непонятно чего ps я не считаю триггера всемирным злом ..... stax Я вижу вы человек обстоятельный, и потратили время написать код. Я поменял одну строчку, и все заработало: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Сам триггер: Код: plsql 1. 2. 3. 4. 5. 6. 7.
О мутации говорило сообщение об ошибке, "нельзя потому что мутация". Меня как человека думающего занимал вопрос - а почему, собственно, таблица мутирует, ведь все уже вставлено? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 17:07 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL почему, собственно, таблица мутирует, ведь все уже вставлено? Все уже вставлено after insert. Не все уж вставлено after insert for each row. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 17:22 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
dmdmdm Все уже вставлено after insert. Дополнение. Анализировать "все, что вставлено", можно в рамках транзакции. Т.е. не учитывая действия других сессий. Если, как часто бывает, важна очередность действий, вам уже было разъяснено про блокировки и прочие методы обеспечения очередности. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 17:25 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
раз уж пошла такая пьянка, гуглите сразу про микрооткаты и statement restart, чтобы не было сюрпризов, когда до update и delete доберетесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 17:32 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
dmdmdm dmdmdm Все уже вставлено after insert. Дополнение. Анализировать "все, что вставлено", можно в рамках транзакции. Т.е. не учитывая действия других сессий. Если, как часто бывает, важна очередность действий, вам уже было разъяснено про блокировки и прочие методы обеспечения очередности. Да, я так и понимаю. Очередность действий не важна, если insert вставляет более одной строки, это ожидается. Я пну еще раз эту довольно-таки мертвую лошадь: > Не все уж вставлено after insert for each row. Так решили инженеры Оракл, и в этом наверное есть глубокий смысл, который пока от меня ускользает. Вместо этого, Оракл мог решить что ВСЕ построчные после-триггеры будут вызваны после того, как все строчки уже вставлены, и таблица не мутирует. Это было бы симметрично поведению до-триггеров, которые ВСЕ вызываются до изменений. Это умеет делать MSSQL, т.е. это возможно, только не в имплементации оракла. (код ниже). Почему так сделано в Оракле, мне неизвестно. Запрет существует даже при вставлении одной строки, когда преград нет. Оракл не позволяет доступиться только к вставленным данным из statemen-level триггера, у MSSQL есть "inserted" псевдотаблица, которая легко бы решила мою задачу: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Поэтому у меня так и не получилось передать :new из триггера в процедуру без копирования индивидуальных колонок. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 17:50 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQLПочему так сделано в Оракле, мне неизвестно. Ты поймёшь это если попытаешься написать свою собственную СУБД. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 17:53 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Кстати, в statement-level триггерах у Оракла похоже (я пока не нашел) вообще нет информации о том, что было вставлено или изменено. Даже количество вовлеченных строчек неизвестно. Т.е. блочный триггер на удаление вызывается когда было удалено "0 или более" строк. а что тогда может "instead of insert" блочный триггер делать? Отметить факт пропажи строчек которые не вставились? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 17:55 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Я поменял одну строчку, и все заработало: ... ведь все уже вставлено? не одну строчку, а "тип" триггера в операторных триггерах нет мутации не все вставлено напр вставляете сразу три строки, "все вставлено" поcле вставки третьей строки так и обходят мутацию, накапливают инфу в строчном, и обрабатывают уровня оператора ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 17:59 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLПочему так сделано в Оракле, мне неизвестно. Ты поймёшь это если попытаешься написать свою собственную СУБД. Возможно, возможно нет. У майкрософта это работает, преграда похоже в голове, а не в принципах СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:03 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Stax НеофитSQL Я поменял одну строчку, и все заработало: ... ведь все уже вставлено? не одну строчку, а "тип" триггера в операторных триггерах нет мутации не все вставлено напр вставляете сразу три строки, "все вставлено" поcле вставки третьей строки так и обходят мутацию, накапливают инфу в строчном, и обрабатывают уровня оператора ..... stax Если я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на уровне оператора пройтись по списку? Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:06 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Кстати, в statement-level триггерах у Оракла похоже (я пока не нашел) вообще нет информации о том, что было вставлено или изменено. Даже количество вовлеченных строчек неизвестно. Т.е. блочный триггер на удаление вызывается когда было удалено "0 или более" строк. а что тогда может "instead of insert" блочный триггер делать? Отметить факт пропажи строчек которые не вставились? считайте в FOR EACH ROW и используйте в statement-level ps "Отметить факт пропажи строчек" - непонятно что пропало ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:06 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQLУ майкрософта это работает, преграда похоже в голове, а не в принципах СУБД. Да. И мы все знаем чья это голова. У MS нет триггеров уровня строки. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:07 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Это умеет делать MSSQL Который в отличие от оракла изначально шёл от блокировочной модели, а не от версионной. И в котором есть понятие "грязные чтения". К тому же, сравнение некорректно как минимум потому, что в mssql нет row level триггеров, о чём явно говорит официальная документация. авторЗначение FOR или AFTER указывает, что триггер DML срабатывает только после успешного запуска всех операций в инструкции SQL, по которой срабатывает триггер. Кроме того, до запуска триггера должны успешно завершиться все каскадные действия и проверки ограничений , на которые есть ссылки. НеофитSQL Запрет существует даже при вставлении одной строки, когда преград нет. Потому, что row level триггер не знает о существовании других строк. Он срабатывает на действие с конкретной строкой. А таблицы inserted/deleted, да, полезная штука. Увы, не завезли. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:11 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Если я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на уровне оператора пройтись по списку? Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр. можно ид, можно ровиды дело вкуса зы насчет :new, смеритесь нет (возможно пока) в оракля new типа "record" ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:11 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQLЕсли я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на уровне оператора пройтись по списку? Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр. Назовите таблицу, в которую будете вставлять вставленные строки, INSERTED и внезапно паззл сложится. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:12 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Даже количество вовлеченных строчек неизвестно А зачем оно в триггере? Вне его есть sql%rowcount. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:14 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Staxнасчет :new, смеритесь нет (возможно пока) в оракля new типа "record" А параметр процедуры этого типа есть? Я честно не в курсе... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:15 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Stax НеофитSQL Если я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на уровне оператора пройтись по списку? Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр. можно ид, можно ровиды дело вкуса зы насчет :new, смеритесь нет (возможно пока) в оракля new типа "record" ..... stax Спасибо, смирился. Посмотрел как другие в интернете с этим справляются - копируют по одной колонке, лучше ничего не придумали. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 18:21 |
|
|
start [/forum/topic.php?fid=52&msg=40009957&tid=1880777]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
83ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 193ms |
0 / 0 |