|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вопрос: как передать значение строки в функцию для обработки? Код: plsql 1. 2. 3. 4. 5. 6.
Передача :new как параметр не разрешается компилятором, присваивание тоже запрещено, только доступ к индивидуальным полям через :new.XYZ. Поскольку на момент вызова триггера строка уже в таблице, я знаю ее ключ и даже rowid, которые могу передать в функцию. Но прочитать строку по PK или rowid не могу, select * into rec_new from REACTOR_EVENTS re where re.id = .. / re.rownum=.. дает ошибку что таблица все еще мутирует после вставки, читать ее нельзя из триггера. Колонок в таблице не так уж и много, поэтому я сделал Код: plsql 1. 2. 3. 4. 5. 6.
Все работает, но теперь этот код нужно помнить подправить каждый раз таблица меняется. Отсюда вопрос: как передать из триггера "после-вставки" значение вставленной строки в функцию обработки? Функцию обработки я вынес из триггера для юнит-теста, т.к мне нужно прогнать наборы данных через триггер, не внося изменений в промышленную таблицу, в которую у меня даже не должно быть права писать. Функцию я могу вызвать на любом наборе данных, а также передать ей отладочные параметры. Как делать отладку на коде триггеров, я даже не представляю. Более широкий вопрос: как юнит-тестить и дебагить код внутри триггера? добавление строк в таблицу нежелательно, т.к. приводит к нежелательному изменению состояния системы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 01:23 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
дает ошибку что таблица все еще мутирует после вставки, читать ее нельзя из триггера.Всё правильно, т.к. этот триггер может быть не единственным на такое событие у таблицы, а порядок срабатывания триггеров на одно событие не определен, поэтому может после него сработать и другой триггер. Т.е. данные в таблице ещё не устаканились и уж тем более не закоммитились. Передавать попольно, afaik. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 03:57 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL, 0) никогда, ни при каких обстоятельствах, и ни по чьему велению не ставьте натурных экспериментов на боевой системе. 1) нежелательные для вас изменения происходят не после команды insert, а после команды commit, у которой есть парно-обратная - rollback, используйте rollback в экспериментах там, где это необходимо. 2) почитайте и посмотрите любые примеры на составные триггеры, их делали специально и персонально для вас, и они долго ждали своего часа. 3) имеющийся в вашей среде отладчик вполне отладит ваши триггера, если они будут скомпилированы в режиме интерпретации и с включением отладочной информации. 4) если у вас есть возможность избегать использования триггеров - старайтесь избегать. Это определенная дисциплина проектирования, прежде всего. --------------------- Имхо, по тому что вы пишете, (мне) ясно, что вы делаете игрушечную систему, рассчитанную на малую нагрузку и общий небольшой объем данных. Попробуйте далее, когда возникнет желание написать триггер, обязательно представлять себе, что вы подносите голую руку с горящей в ней спичкой к горке магниевых стружек в смысле эффекта, оказываемого на производительность вставки (она горит при этом ярким фонтаном огня, жестко обжигая вокруг себя все, включая поджигателя). Ну, или что вы стеклянную колбу с царской водкой в руках несете, и ваша задача - не споткнуться. Когда дело дойдет до "настоящих" требований по производительности, примерно также придется относиться и к каждому создаваемому индексу. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 04:46 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
booby, авторКогда дело дойдет до... чтения документации... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 09:10 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL, Для начала было бы неплохо прочитать документацию про триггеры, какие виды есть, для чего нужны и когда какие срабатывают. Почему не используете before триггер? Если вы хотите свои тесты залить на боевую систему, еще раз перечитайте то что вам написал booby. Касательно функций и прочего PL/SQL, нужно четко понимать SQL - транзакционный, PL/SQL - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 14:25 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
graycode ... нужно четко понимать SQL - транзакционный, PL/SQL - нет. В такой простой формулировке, это слишком сложное высказывание. Имхо, выглядит как out of context, в нём недостаточно явных битов информации на количество букв, и потому, оно, для первого чтения, совершенно бессмысленное. Это шифровка. Общий контекст восприятия возникает на фоне овладения концептами "транзакция", "согласованные изменения" и "потеря изменений при конкуренции". Если нет понимания ничего из этого - умнее и упоминать, всё равно не будет понято, о чём идет речь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2020, 17:54 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Правильный Вася дает ошибку что таблица все еще мутирует после вставки, читать ее нельзя из триггера. Передавать попольно, afaik. Спасибо за объяснение; я не совсем его понял. Почему таблица считается мутирующей на чтение в "после" триггере? Я предполагал что раз уж в после-триггере запрещено изменение таблицы, то сама таблица находится в стабильном состоянии. Даже если их несколько, все после-триггеры должны увидеть одну и ту же таблицу, с уже вставленной строкой. Есть ли логическое обоснование, почему после-триггеру запрещено прочитать из таблицы только что вставленную строку, или это просто ограничение имплементации? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 01:40 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
booby, Много полезных комментариев. 0) согласен, боевая система не должна использоваться для разработок. В моей работе, это правило не применяется. 1) я изучу, можно ли весь код триггера сделать совместимым с откатом. Использование отката для юнит-тестов не приходила мне в голову, т.к. у триггера есть побочные эффекты которые не откатятся. 2) почитаю про составные триггеры, о которых знаю "краем глаза". Я предполагал, что мой вопрос слишком простой для таких конструкций. (3) понял, не знал (4) о вреде триггеров. Я понимаю, что они считаются вредными для скорости. Есть другие причины? Этот триггер вызывается раз в минуту, не чаще. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 01:57 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL, Вам сейчас нужно больше думать о допустимости и последствиях в вашей конкретной ситуации неоткатываемых действий. "Другие причины" лежат вокруг того, что вы сознательно вплетаете отключаемые событийные интерфейсы. Если это было сделано до вас, и вы не вполне понимаете, что это такое - это одна сторона медали. Если вы делаете это своей рукой, хорошо, чтобы вы абсолютно точно понимали и что это такое, и как вы собираетесь с этим долго жить в условиях неизвестных вам сегодня будущих потребностей. И особенно , когда вы на голубом глазу собираетесь в контексте транзакции выполнять неоткатываемые действия. Вы кого-то заведомо обмануть пытаетесь, или это способ тотальной слежки за мыслями и случайными почёсываниями? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 02:15 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
graycode Почему не используете before триггер? . Я выбрал после-триггер, т.к. мой код обработки событий не предполагает изменения самого события, те остаются в первоначальном виде. Также, если у таблицы когда-то появится* до-триггер, я хотел чтобы код обработки событий видел окончательное значение события, а не сырое промежуточное. (*) Уже появился; пришлось повесить до-триггер когда дополнял таблицу событий первичным ключом. До 12.х у оракла не было автоинкремента колонки, пришлось добавить короткий до-триггер с :new.id := sequence.nextval ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 02:31 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Почему таблица считается мутирующей на чтение в "после" триггере? Не забывай, что другой триггер на это row-событие (или в целом на table-событие) может попытаться что-то сделать, что вызовет exception, а это автоматом отменит транзакцию. Например, в другом триггере будет неудачная попытка каскадных изменений в каких-то зависимых таблицах или сложная проверка целостности данных. НеофитSQL все после-триггеры должны увидеть одну и ту же таблицу, с уже вставленной строкой. НеофитSQL Есть ли логическое обоснование, почему после-триггеру запрещено прочитать из таблицы только что вставленную строку, или это просто ограничение имплементации? И почитай разницу между блокировочниками и версионниками среди СУБД. Это к вопросу имплементации. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 02:51 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
booby, О неоткатываемых действиях и прочих "обманах". Одно известное мне сегодня неоткатываемое действие - запись ошибок исполнения в лог/таблицу ошибок. Логгинг, по своей природе, не следует отката, и сохраняет сообщения об ошибках кода даже при откатах. Я не знаю, есть ли код с побочными эффектами кроме лога ошибок, но посмотрю. Я следую установленной в продукте архитектуре, которая использует триггеры довольно обширно, включая каскадную их разновидность, когда изменение строки в одном представлении выстреливает триггеры в нескольких других. Это выглядело способным вызвать кольцевую зависимость, поэтому я для себя набросал иерархию представлений и таблиц - какие триггеры могут писать в какие таблицы. Все пока легло в дерево, т.е. каждое одиночное изменение должно закончиться в конечное время. Возможно, уже кто-то написал best practices: как в оракле принято обрабатывать внешние события, и я просто ещё не нашел этот труд. Он мог бы начинаться "избегайте таблиц с триггерами в качестве механизма передачи внешних событий, вместо этого оформите внешние события в виде...."? Сообщений? Запросов? Поллинга внешних таблиц? Как это принято делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 02:53 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Я благодарен вашему терпению. Я наверное задаю новичковые вопросы. С триггерами познакомился буквально два дня назад. Правильный Вася НеофитSQL Почему таблица считается мутирующей на чтение в "после" триггере? Не забывай, что другой триггер на это row-событие (или в целом на table-событие) может попытаться что-то сделать, что вызовет exception, а это автоматом отменит транзакцию. Например, в другом триггере будет неудачная попытка каскадных изменений в каких-то зависимых таблицах или сложная проверка целостности данных. Я понимаю что до коммита строка в таблице только для сессии, а не глобально. И коммита ещё может не произойти. Однако, в других ситуациях оракл вполне позволяет мне читать строку для которой ещё не произошел коммит. С точки зрения сессии новая строка уже в таблице, и я могу на ней исполнить селект. Только не даёт это сделать в триггере. Поэтому я спросил. Разве триггер исполняется не в контексте сессии? [quot Ну так row-триггеры и видят ровно одну свою строку в :NEW. [/quot] Я бы этим и пользовался, но у этой псевдопеременной есть ограничения, она не типа rowtype, и ее нельзя передать как параметр. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 03:15 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL ... Одно известное мне сегодня неоткатываемое действие - запись ошибок исполнения в лог/таблицу ошибок. Логгинг, по своей природе, не следует отката, и сохраняет сообщения об ошибках кода даже при откатах. о, боже... "логгинг" - это что, синоним "элегантности"? Есть "логгинг" и "логгинг". Если происходит плановый отказ от завершения транзакции - зачем вообще логировать планово несостоявшиеся действия? Если же фиксируются действия, отвергнутые по наличию ошибок заполнения данных, то это называется не "логгинг", а "валидация". Необходимость сохранения её результатов определяется либо потребностями программиста в трассировке на период отладки, либо конкретными особенностями устройства процедур проверки качества данных. В обоих случаях это не побочный, а явный результат специально организованного процесса, в общем случае, состоящего из произвольного числа транзакций. Вы в своих триггерах ифы писать замучаетесь, чтобы понять, какой именно красоты логирование именно сейчас требуется. У вас вставка в таблицу в таком варианте намертво привязывается к имени процесса, его производящего. Ну, или будете логировать всё подряд в общую мусорку, и результатом нельзя будет воспользоваться содержательно. Конечно, много изумительной мути, в триггерах можно наваять. НеофитSQL ... Как это принято делать? А вот как очередной свежепришедший неофит наляпяет, так и приято. Статистически неотличимая от 100% доля "ынтырпрайза" не является непроходимым гуаном чуть менее, чем целиком. В том числе и в области "логирования". Обычно это является печальным результатом блестящего образования, большого опыта работы, высокой степени самооценки и безграничного доверия руководства. ... И только очумевшие администраторы изредка постанывают - "Ау! Есть читатели на эти великолепные логи? Когда и какой мусор сносить-то можно, к чёртовой матери, или его надо ленту писать?..." ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 04:00 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Сессия и транзакция - суть 2 больших разницы. Читай уже доку , что ль. Изучать монстров типа Оракл по сообщениям форума - это как по учебнику ботаники пытаться понять работу космического корабля во всех нюансах. Сначала базовые вещи, потом детали. НЕ наоборот. У Оракла достаточно документации для РАЗНЫХ уровней подготовки, даже нулячих. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 04:00 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
В первую очередь это сделано именно из-за многострочных операторов Согласованность любого запроса поддерживается на уровне SCN, и строки все будут вставлены/обновлены/удалены тоже на один момент SCN. А внутри одного оператора (многострочного) получится что на один и тот же SCN, триггер, стрельнувший для каждой строки, будет видеть разный набор данных, что противоречит основным принципам ACID ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 04:00 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров, нет смысла ему абракадаброй говорить. Читать у него времени нет. Триггера писать надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 04:21 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Нашел правильный ответ: Таблица мутирует потому что триггер построчный. Доступ к таблице работает нормально из непострочного после-триггера. Проблема решена, всем спасибо. Booby, ваши рассуждения о логгинге слишком упрощены и в данном случае неверны. Я могу посоветовать профильные книги, если вам интересно. Одно из требований доверия к логгингу - запретить любые изменения прошлых событий, в том числе откат. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 04:37 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров В первую очередь это сделано именно из-за многострочных операторов Согласованность любого запроса поддерживается на уровне SCN, и строки все будут вставлены/обновлены/удалены тоже на один момент SCN. А внутри одного оператора (многострочного) получится что на один и тот же SCN, триггер, стрельнувший для каждой строки, будет видеть разный набор данных, что противоречит основным принципам ACID Не без труда, но расшифровал. Спасибо. Строки вставляются группой, а триггер однострочный. Мои трудности оказались связаны с однострочностью триггера, для которого в общем случае не существует стабильного промежуточного состояния таблицы. Для одиночного insert существует, но запрещен инженерами оракла. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 04:45 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL ... Booby, ваши рассуждения о логгинге слишком упрощены и в данном случае неверны.... Спасибо, успокоили. А то я уже волноваться начал даже... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 04:46 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
booby Если происходит плановый отказ от завершения транзакции - зачем вообще логировать планово несостоявшиеся действия? Но, да - это скорее аудит, чем протоколирование. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 07:00 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Правильный Вася Потому что ещё не было коммита . [рукалицо] ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 07:04 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Одно из требований доверия к логгингу - запретить любые изменения прошлых событий, в том числе откат. P.S. И, да - вы всё равно идёте к звёздам не per astra. Запрет изменения реализуется ограничением доступа к таблице аудита. В концептах это всё тоже изложено. Хотя и не "прямо в лоб для вашего случая". ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 07:05 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Правильный Вася НеофитSQL Почему таблица считается мутирующей на чтение в "после" триггере? Оказалось, дело было вовсе не в коммите. Блочный после-триггер читает таблицу без проблем. Построчный - не может, т.к. вызывается (иногда) между стабильными состояниями таблицы. Из-за этого "иногда" построчному после-триггеру всегда запрещено обращение к возможно мутирующей таблице. Я сейчас оценил, что ответ на мой вопрос "почему" требует глубоких знаний, и для всех есть возможность узнать что-то новое. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 07:13 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Basil A. Sidorov НеофитSQL Одно из требований доверия к логгингу - запретить любые изменения прошлых событий, в том числе откат. P.S. И, да - вы всё равно идёте к звёздам не per astra. Запрет изменения реализуется ограничением доступа к таблице аудита. В концептах это всё тоже изложено. Хотя и не "прямо в лоб для вашего случая". Для протоколирования действий у меня отдельная таблица, где действительно работает откат. Логично, т.к. не случилось действие - нет протокола о нем. В логе ошибок у меня "безоткатные" данные, в том числе самодиагностика (asserts в лог) для ловли ошибок в моем коде, или недопустимые состояния, которых не должно быть. Поскольку мой код автоматизации работает без участия человека, мне очень помогает когда он сам рассказывает что у него болит. И не стирает свои жалобы, если где-то exception. А как этот вопрос решают колеры с опытом - просто пишут без ошибок? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 07:28 |
|
Чтение таблицы из триггера (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 |
|
Чтение таблицы из триггера (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 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Может быть с таким количеством "спасибо, не знал" - рановато изобретать замысловатые схемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 16:27 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL, Искренне жаль тех, кому придётся потом это сопровождать. Они не будут знать умозаключений про 0.2 герца, гарантию однопользовательской работы и т.п. Зато будут совершенно искренне материть "умника", влепившего > priorMaxId в триггер, когда наконец докопаются до источника ошибки. Возможно, они удивятся "а что, так можно было, посмотреть из после-триггера на состояние таблицы до триггера?". Вы, env, знаете как это сделать? ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 16:28 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL, Я не вижу смысла в подобной конструкции, т.к. привык к управлению данными через интерфейсы пакетов и разграничение прав доступа. Для данных загружаемых массово проще иметь идентификатор пачки загрузки и дату вставки и изменения. Необходимость в ваших конструкциях возникает разве что при бардаке в доступе к данным. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 16:36 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Кит, я не знал о названии direct load, это используется при backup/restore? это штатный инструмент высокопроизводительной загрузки в БД больших объемов данных откуда угодно, например из текстовых файлов. я не к тому, что это обязательно ваш сценарий, а к тому, что с триггерами много подводных камней. ограничения, производительность, повторные выполнения, НЕвыполнения, негарантированный порядок выполнения... если вы, как вы говорили в какой-то из своих тем, привыкли работать с кодом, который пишется так, чтобы к нему не возвращаться, то скорее всего решение на триггерах - не ваш выбор. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 16:38 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL "а что, так можно было, посмотреть из после-триггера на состояние таблицы до триггера?" ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 16:39 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
кит северных морей, Не надо подкидывать ему ещё и это... кит северных морей который пишется так, чтобы к нему не возвращаться Так всё верно, к такому коду возвращаться не захочется. Проще свалить в другое место. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 16:43 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL, Я не вижу смысла в подобной конструкции, т.к. привык к управлению данными через интерфейсы пакетов и разграничение прав доступа. Для данных загружаемых массово проще иметь идентификатор пачки загрузки и дату вставки и изменения. Необходимость в ваших конструкциях возникает разве что при бардаке в доступе к данным. судя по всему, он автоматизирует взаимодействие независимох процессов без замены внешних интерфейсов. отсюда уведомления, очереди и прочая событийность, но такая, чтобы "точки входа" в существующие процессы не менять. Ясен пень, что триггер поднимается на событие - вот ему и точка взаимодейтвия. А то, что его взаимолдействие - неуправляемое, с ложными срабатываниями - ему пока до лампады. И пока просвета не видно. Вообще, упорства и энергии парню, конечно, не занимать. Но до применения его в мирных целях пока очень далеко. Жесть, огонь, пальба и приляпывание косвенности в местах, о которых он случайно прочитал к текущему моменту. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 17:44 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
кит северных морей НеофитSQL "а что, так можно было, посмотреть из после-триггера на состояние таблицы до триггера?" Нет конечно, я даже слов таких не знал до сегодняшнего дня. Ооо, прочитал. Это прямо машина времени. Я использовал свойство функций объявленных как автономная транзакция, которые не видят posted данные, поэтому может доступиться к таблице состоянии до вставки* в после-вставочном триггере. (*) в моем конкретном случае: для импорта событий всех таблиц, "до вставки" и "последний комммит" это одно и то же, каждая строка импорта сопровождается коммитом, т.к. откаты по событиям не поддерживаются бизнес-логикой. (**) на всякий случай я удостоверился что механизм импорта автоматически делает построчный коммит, и добавил в триггер код который не позволит вставлять строку если есть некомитнутые. Адын страка - адын камит. Ибо к действиям на мой код извне я привык относиться с подозрением и бить по рукам если не так, с соответствующей внятно описанной ошибкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 19:06 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL, Я не вижу смысла в подобной конструкции, т.к. привык к управлению данными через интерфейсы пакетов и разграничение прав доступа. Для данных загружаемых массово проще иметь идентификатор пачки загрузки и дату вставки и изменения. Необходимость в ваших конструкциях возникает разве что при бардаке в доступе к данным. "не знаю и не нужно" - позиция для программиста слабая. знать надо много, больше чем нужно, т.к. незнакомые грабли бьют не хуже знакомых. Посмотрите, я раскрыл "секрет" в другом сообщении. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 19:10 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL "не знаю и не нужно" - позиция для программиста слабая. Да, именно ваши методы слабо знакомого с инструментом - позиция сильная. Продолжайте. Здесь клоунов любят. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 19:27 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
К слову о неожиданных граблях - вот мои сегодняшние. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Никогда не пользовался currval, попробовал ради интереса и тут же получил граблями. Sequence определена с инкрементом 1, у меня прыгнула сразу на 5. Почитал оракловскую документацию, нашел завуалированый намек на причину такого поведения, хотя прямой текст говорит: возвращает последнее значение. Тут явно не последнее, а прошлогоднее какое-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 19:32 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQLНикогда не пользовался ... Почитал ... , нашел завуалированый намек ... Это все неудивительно. Удивительно, что вы игнорируете очевидные советы сходить в поиск , почитать документацию, попробовать. А главное - поступить на работу, где старший товарищ вместо форума будет вас направлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 19:44 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
dmdmdm Да, именно ваши методы слабо знакомого с инструментом - позиция сильная. Открою секрет моего успеха: я использую в работе только инструменты с которыми хорошо знаком, и после тщательных проверок что мое понимание функции инструмента сочетается с действительностью в рамках моей задачи и метод использования является задокументированым. Поэтому я на данном этапе моих скромных знаний привожу задачи к самым простым знаменателям, и решаю их в срок и без переделок. Иногда допускаю промахи, которые мой опытный коллега ловит при код ревью. А в экспериментах - все что угодно. Отверткой копаю, рулеткой стучу, веревкой режу. Получаю неоценимые подсказки от публики, образовываюсь, получаю удовольствие. Стараюсь не раздражать старейшин форума. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 19:46 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
dmdmdm НеофитSQLНикогда не пользовался ... Почитал ... , нашел завуалированый намек ... Это все неудивительно. Удивительно, что вы игнорируете очевидные советы сходить в поиск , почитать документацию, попробовать. А главное - поступить на работу, где старший товарищ вместо форума будет вас направлять. Вы ответили так, как вроде знаете причину пропуска чисел в sequence в моем примере. В правильном ответе всего три слова, но они не те, которые вы мне предложили гуглить. Вы знаете, почему currval отстает на 5 (или 10, или 15), а не на 1? Я сегодня узнал. Между вызовом currval и nextval никто нигде не доступался к этому объекту sq_test. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 19:53 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL после тщательных проверок P.S. Нет, я даже не издеваюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 20:17 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Именно "тщательная проверка" является одним из способов подгонки реальности под собственные представления. Вот такой вот когнитивный парадокс. P.S. Нет, я даже не издеваюсь. Извините, но я не понимаю что вы хотите сказать. Возьмем конкретный пример: у меня были основания думать что используемый в системе (в нескольких местах) метод построчного импорта данных исполняет коммит после каждой строки. Документация намекает что это так, но прямо не говорит. Это для меня желаемое поведение. Я нашел способ проверить что это действительно так, двумя способами. Убедился что так. (на тестовой БД) После этого, я добавил проверку в который даст ошибку в явном виде если поведение импорта когда-либо изменится на нежелаемое. Тогда мой код им (снаружи) скажет "делай коммит после каждой строки в явном виде, иначе не работает". Таким образом, я максимально сузил вводные данные и значительно упростил логику обработки событий. Мой code coverage в юнит-тесте выше 90%. А как вы решаете подобные задачи? Пишете код с максимальной выживаемостью, "на вырост" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 20:56 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL прямой текст говорит: возвращает последнее значение. Тут явно не последнее, а прошлогоднее какое-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 21:00 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Тогда мой код им (снаружи) скажет "делай коммит после каждой строки в явном виде, иначе не работает". И что произойдёт при увеличении объёма импорта? НеофитSQL знать надо много, больше чем нужно Но это не ваш путь. Явно. Вам удобнее взять один инструмент, показавшийся подходящим, и прикручивать его на изоленту и клей, затыкая дыры ограничениями для внешних вызывающих систем. Вместо того, чтобы задаться вопросом "а как правильно решить эту задачу". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 06:37 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Посмотрите, я раскрыл "секрет" в другом сообщении Можете убедительно доказать, что поведение выбранного вами "секрета" не сменится при обновлении версии, добавлении патча, в многопользовательской среде? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 06:39 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Отверткой копаю, рулеткой стучу, веревкой режу Идеальное описание вашего подхода к разработке на стороне бд. Лучше не скажешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 06:40 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL Посмотрите, я раскрыл "секрет" в другом сообщении Можете убедительно доказать, что поведение выбранного вами "секрета" не сменится при обновлении версии, добавлении патча, в многопользовательской среде? Доказывать? Увольте. Это черным по белому, в документации oracle написано. Почитайте про Read Committed Isolation Level, многие вопросы отпадут. Про сиквенс .currval/nextval подсказать, или ещё подумаете, как в единственной активной сессии разрыв появился? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 08:07 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL Тогда мой код им (снаружи) скажет "делай коммит после каждой строки в явном виде, иначе не работает". И что произойдёт при увеличении объёма импорта? Получу повышение. Ведь это прибыльные уведомления. Чем больше, тем лучше. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 08:15 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Про сиквенс .currval/nextval подсказать, или ещё подумаете, как в единственной активной сессии разрыв появился? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 08:28 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQLАдын страка - адын камит. а это не твой "опытный коллега" в соседней теме решает то, что ты сочинил ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 10:09 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Кит, я не знал о названии direct load в старых версиях "direct load" для insert ... values ... не работал да и зачем Вам етот direct load, пока-что забейте на него ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 10:21 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL К слову о неожиданных граблях - вот мои сегодняшние. недоговариваете (махлюете) currval нельзя получить где-то не дернув nextval .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 10:35 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
123йй НеофитSQLАдын страка - адын камит. а это не твой "опытный коллега" в соседней теме решает то, что ты сочинил ? комит комиту рознь. Ставлю на то, что в обоих случаях удаленный клиент комитит. При частоте 0.2 тех проблем не получишь, но удивление может прибежать, когда кто-нибудь с большими потоками скажет - о яка гарна система, дайте нам такую... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 10:38 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Про сиквенс .currval/nextval подсказать Не осилили сходу прочитать про cache и order? Бывает. Тут таких тем от студентов - пачками. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 14:52 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Но почему-то не озвучивает Постеснялся что-ли? Вроде не замечено за ним особой стеснительности -- вываливает свои домыслы совершенно свободно И я почему-то уверен, что в подсказке он выдаст частный случай (alter sequence), хотя в доке описан более общий ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 15:08 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров, у него примерно с частотой 0.2ГЦ палятся номера ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 15:19 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Stax НеофитSQL К слову о неожиданных граблях - вот мои сегодняшние. недоговариваете (махлюете) currval нельзя получить где-то не дернув nextval .... stax Как это получилось: В "главной" сессии дернул nextval. получил 31. Сессия осталась живой. Вторая сессия потянула свой nextval 4 раза: 32,33,34,35, и закрылась. Дальше - как на экране. Currval дает последнее число, но для сессии. По незнанию, я ожидал что получу текущее значение сиквенса, его не меняя. Похоже, такой операции просто нет. Чтобы прочитать глобальный сиквенс, его надо изменить. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 15:27 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL как в единственной активной сессии НеофитSQL Вторая сессия потянула Да вы, батенька, тот ещё шулер. упд. Про то, что ваши конструкции развалятся в многопользовательком режиме, вам говорят чуть ли не с первого топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 15:49 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров НеофитSQL Про сиквенс .currval/nextval подсказать, или ещё подумаете, как в единственной активной сессии разрыв появился? Да, это были мои грабли - я подумал что currval позволяет прочитать значение глобального сиквенса. Оказалось - фигвам. Если хочешь узнать значение - изволь его заодно увеличить. Как прочитать без инкремента - наверное только через dbms функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 15:49 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL как в единственной активной сессии НеофитSQL Вторая сессия потянула Да вы, батенька, тот ещё шулер. Следите за руками лучше :) Текст фактически корректен. Все, что было показано на экране - произошло в одной одинокой сессии. Между вызовами currval и nextval других сессий не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 15:55 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL я подумал А надо было документацию прочитать, а не додумывать. One user can never acquire the sequence number generated by another user . After a sequence value is generated by one user, that user can continue to access that value regardless of whether the sequence is incremented by another user. Sequence numbers are generated independently of tables, so the same sequence can be used for one or for multiple tables. It is possible that individual sequence numbers will appear to be skipped, because they were generated and used in a transaction that ultimately rolled back. Additionally, a single user may not realize that other users are drawing from the same sequence. ... Any reference to CURRVAL always returns the current value of the sequence, which is the value returned by the last reference to NEXTVAL. Before you use CURRVAL for a sequence in your session , you must first initialize the sequence with NEXTVAL ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 15:58 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Между вызовами currval и nextval других сессий не было Т.е. вы так и не осилили концепцию многопользовательской работы? Именно, что была. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:03 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Stax пропущено... недоговариваете (махлюете) currval нельзя получить где-то не дернув nextval .... stax Как это получилось: В "главной" сессии дернул nextval. получил 31. Сессия осталась живой. Вторая сессия потянула свой nextval 4 раза: 32,33,34,35, и закрылась. Дальше - как на экране. Currval дает последнее число, но для сессии. По незнанию, я ожидал что получу текущее значение сиквенса, его не меняя. Похоже, такой операции просто нет. Чтобы прочитать глобальный сиквенс, его надо изменить. Не верю что во Второй сессии авторCurrval дает последнее число, но для сессии не дернув nextval Currval не штатно не получить Код: plsql 1. 2. 3. 4. 5.
ps c cash дырки будут ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:04 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Между вызовами currval и nextval других сессий не было. А теперь продемонстрируйте, что в вашем понимании "была другая сессия между ... ". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:05 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Все, что было показано на экране - произошло в одной одинокой сессии. Между вызовами currval и nextval других сессий не было . автор Вторая сессия потянула свой nextval 4 раза: 32,33,34,35, и закрылась. кто-то запутался в двух соснах ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:08 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Но почему-то не озвучивает Постеснялся что-ли? Вроде не замечено за ним особой стеснительности -- вываливает свои домыслы совершенно свободно И я почему-то уверен, что в подсказке он выдаст частный случай (alter sequence), хотя в доке описан более общий alter sequence - это как подкрутка одометра? Это была бы не загадка, а издевательство. Тут все было чесноком. Человек садится у компьютера, в открытой сессии с неизвестной ему историей. Проверяет, что других сессий нет, он с ораклом наедине. спрашивает currval - получает 31 (т.е. сессия уже работала с сиквенсом) спрашивает nextval - получает 36. Мне это показалось необычным, т.к. о кэше сиквенса в доках говорится в основном в контексте скорости. Про currval Оракл пишет максимально просто: (я подправил, согласно моему пониманию) CURRVAL: Returns the current value of a sequence (returns the last value returned from nextval in the same session) NEXTVAL: Increments the sequence and returns the next value ... Any reference to CURRVAL always returns the current value of the sequence, which is the value returned by the last reference to NEXTVAL (in the same session) Отсюда: https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns002.htm Такое поведение currval для новичка неинтуитивное, но полезное: можно пользоваться currval вместо запоминания числа в переменной, оно не изменится в контексте сессии. Пример в конце страницы по ссылке выше это демонстрирует. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:16 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Stax НеофитSQL Все, что было показано на экране - произошло в одной одинокой сессии. Между вызовами currval и nextval других сессий не было . автор Вторая сессия потянула свой nextval 4 раза: 32,33,34,35, и закрылась. кто-то запутался в двух соснах ..... stax Похоже. Вот карта: вторая сессия отработала до того , что показано на экране. Все, что было показано на экране - произошло в одной одинокой сессии. Между вызовами currval и nextval других сессий не было ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:19 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Такое поведение currval для новичка неинтуитивное С чего бы? Текущее значение, полученное последним этим самым новичком. Очень даже интуитивно. Но вы продолжайте бессистемно тыкаться носом в частности, не читая концепций. Чудес будет много. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:22 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL Между вызовами currval и nextval других сессий не было Т.е. вы так и не осилили концепцию многопользовательской работы? Именно, что была. А, вижу что вы так и не поняли пока. Похоже, что не сталкивались. посмотрите другие ответы, должно проясниться. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:23 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL вторая сессия отработала до того , что показано на экране. Включая первый вызов nextval? Заговариваетесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:23 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL А, вижу что вы так и не поняли пока Нет. Это вы упорно живёте в императивном однопоточном мире. У вас получился классический пример "чудес" многопользовательского режима. Именно из-за непонимания, что вторая сессия была и работала с тем же объектом. упд. нарисуйте себе на бумажке таймлайны сессий, может так дойдёт ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:25 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL Такое поведение currval для новичка неинтуитивное С чего бы? Текущее значение, полученное последним этим самым новичком. Очень даже интуитивно. Но вы продолжайте бессистемно тыкаться носом в частности, не читая концепций. Чудес будет много. О, вы теперь поняли о чем речь. currval возвращает последнее значение nextval для этой сессии . Вы конечно об этом давно знали, из документации :) Подскажите, где Оракл это описывает? Никак не найду. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:26 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Подскажите, где Оракл это описывает? Парой сообщений выше цитата. И на моей памяти вы единственный человек, для которого это оказалось неинтуитивным. За все годы работы с бд в целом и ораклом в частности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:30 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL env пропущено... Т.е. вы так и не осилили концепцию многопользовательской работы? Именно, что была. А, вижу что вы так и не поняли пока. Похоже, что не сталкивались. посмотрите другие ответы, должно проясниться. Но, как обычно, аффтар не читатель Думал там действительно что-то из https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-views-sequences-and-synonyms.html#GUID-5ABC0615-BE0C-48CE-BD18-C86AAF7DF953 The database might skip sequence numbers if you choose to cache a set of sequence numbers. For example, when an instance abnormally shuts down (for example, when an instance failure occurs or a SHUTDOWN ABORT statement is issued), sequence numbers that have been cached but not used are lost. Also, sequence numbers that have been used but not saved are lost as well. The database might also skip cached sequence numbers after an export and importхотя здесь тоже не отражен случай, что определение просто выгрузилось из Library Cache Насколько помню, в более ранних версиях про это было написано PS. Но ты продолжай -- и мы поразвлекаемся и ты таки что-то новое узнаешь ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:32 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL вторая сессия отработала до того , что показано на экране. Включая первый вызов nextval? Заговариваетесь. Вы наверное спорите о правилах шахмат после каждого проигрыша. Держите марку. Вот что я представил: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Я не показал первый nextval (Stax и другие быстро смекнули что он конечно же был), я только сказал что между currval и nextval (на экране) никаких других сессий не происходило. Это правда. Это была задачка подумать про контекст, и как такой разрыв мог произойти. Вячеслав (явно опытный товарищ) выдвинул одну гипотезу, которая вполне могла объяснить наблюдаемый разрыв. Других предложений я не видел, надеюсь что не пропустил. Если хотите, я вам лично еще загадок накидаю, полегче. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:35 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
это единственный человек для которого так много оказалось интиетивно неправильно понятным, что читать документацию совсем не обязательно Ну он честно сразу же и сказал, что программировать по документации может каждый слабак не интересно, а у него программирование становится как настоящее искусство... хождение по граблям творческий поиск ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:36 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Это тебе еще про кластер (RAC) не рассказали Там может быть еще интересней ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:38 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Других предложений я не видел Неудивительно, вы же очень избирательно читаете только то, что укладывается в вашу картину мира. Вот если вы сможете повторить это в действительно одной сессии, тогда "загадка" будет. А так - документированное поведение в многопользовательском режиме и крючкотворство в игре словами. Является чудом только для тех, кто не читал документацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:45 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Загадкой, возможно и не будет Если между операторами прошел достаточный срок В БД есть и другие процессы/сессии, живущие своей жизнью, которым плевать на твою последовательность, но у них есть свои SQL-операторы, которые могут вытеснить определение твоей последовательности из Library Cache ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:52 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Думал там действительно что-то из https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-views-sequences-and-synonyms.html#GUID-5ABC0615-BE0C-48CE-BD18-C86AAF7DF953 The database might skip sequence numbers if you choose to cache a set of sequence numbers. For example, when an instance abnormally shuts down (for example, when an instance failure occurs or a SHUTDOWN ABORT statement is issued), sequence numbers that have been cached but not used are lost. Also, sequence numbers that have been used but not saved are lost as well. The database might also skip cached sequence numbers after an export and import Насколько помню, в более ранних версиях про это было написано PS. Но ты продолжай -- и мы поразвлекаемся и ты таки что-то новое узнаешь Вячеслав, вышеописанные случаи вряд ли применимы здесь. В документе по ссылке выше Оракл описывает случаи когда разрывы происходят из-за жесткой потери чисел сиквенс. Жесткая потеря - это особый случай, когда числя в кэше потерялись, не будучи использованными из-за сбоя, потери питание, и т.д. Появился разрыв, этих чисел никто не видел и не увидит. В моем примере нет потери чисел, и нет сбоев, все работает штатно. Все числа сиквенса были успешно получены, все находятся в таблице. Есть наблюдаемый разрыв внутр сессии, т.к. currval намеренно (и я считаю полезно для программиста) возвращает текущее значение не глобального объекта, а запомненного последнего значения для этой сессии. Следствие: две разные сессии которые вызовут currval на одном объекте ВСЕГДА увидят разные числа. Пока я только пользовался nextval, все эти тонкости мне были незаметны. А когда заметил, углубился потому что мне интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 16:55 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров, это пока цветочки. Ягодки проявятся, когда выяснится, что у него на сиквенсах сторонняя логика построена, типа раз значение меньше, то ясно, что оно раньше, а иначе позже. Вот это будет - обхохочешься. И по той уверенности в своих навыках понимания, которые демонстрирует клиент, я почти уверен, что так уже и есть. :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 17:02 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Ты просто не осилил, что я сказал Почему нужно сомневаться что currval вернет тоже значение что и предыдущий nextval, если у него такое предназначение и это описано в доке -- мне трудно понять Но, наверное, сомневаться -- это здорово, нам некогда работать -- будем сомневаться PS. А еще не натыкался, что несколько вызовов nextval в одном запросе возвращают одно значение? Вот где разрыв шаблона! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 17:05 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL, Держите "загадку". От первого nextval до select currval других сессий не было. Код: 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.
Изученных инструментов должно хватить для "решения". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 17:09 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Ты просто не осилил, что я сказал Почему нужно сомневаться что currval вернет тоже значение что и предыдущий nextval, если у него такое предназначение и это описано в доке -- мне трудно понять Но, наверное, сомневаться -- это здорово, нам некогда работать -- будем сомневаться PS. А еще не натыкался, что несколько вызовов nextval в одном запросе возвращают одно значение? Вот где разрыв шаблона! Да ну, неужели? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Шучу. Я в работе не натыкался, но на неделе видел в документации, оракл об этом очень недвусмысленно говорит. Вроде еще есть ограничения на внутренние селекты. > Почему нужно сомневаться что currval вернет тоже значение что и предыдущий nextval Это потому, что не написано "предыдущий nextval для этой сессии". В многопользовательском режиме это существенное различие, особенно когда в следующей строчке таким же языком описывается nextval независим от сессии. Возможно это мои тараканы, когда я работал редактором тех документации я обращал внимание на такие мелочи. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 17:50 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL, Навык умалчивания контекста и крючкотворства в игре словами с той же поры остался? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 17:56 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL Других предложений я не видел Неудивительно, вы же очень избирательно читаете только то, что укладывается в вашу картину мира. Вот если вы сможете повторить это в действительно одной сессии, тогда "загадка" будет. А так - документированное поведение в многопользовательском режиме и крючкотворство в игре словами. Является чудом только для тех, кто не читал документацию. Вы много раз говорили про "документированное поведение", но ссылку на документацию так и не нашли. Вряд ли найдете. Думаю, что в официальной документации "currval - в контексте сессии, а nextval - глобальный" так нигде и не упомянуто. По этой причине, Ораклу пришло много баг репортов, и их отделу техподдержки пришлось писать аж целую объяснительную. https://support.oracle.com/knowledge/Oracle Database Products/2588246_1.html Давайте я лучше новый вопрос задам на понимание сиквенс. Вот этот самый кэш сиквенса (который длиной двадцать по умолчанию, и может повлиять на скорость), он глобальный для БД, или свой на каждую сессию? (этого нет в доках, надо подумать). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 18:18 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Такое поведение currval для новичка неинтуитивное, но полезное: можно пользоваться currval вместо запоминания числа в переменной, оно не изменится в контексте сессии. Пример в конце страницы по ссылке выше это демонстрирует. не забывайте о триггерах ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 18:26 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Вы много раз говорили про "документированное поведение", но ссылку на документацию так и не нашли. Вряд ли найдете. 22218292 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 18:30 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
booby Вячеслав Любомудров, это пока цветочки. Ягодки проявятся, когда выяснится, что у него на сиквенсах сторонняя логика построена, типа раз значение меньше, то ясно, что оно раньше, а иначе позже. Вот это будет - обхохочешься. И по той уверенности в своих навыках понимания, которые демонстрирует клиент, я почти уверен, что так уже и есть. :)) Точно, у меня так и есть: сиквенс используется чтобы установить порядок, в котором импортировались данные через заданный канал. Поскольку глобальный сиквенс - это монотонно увеличивающийся безоткатный счетчик, это должно надежно работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 18:32 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Давайте я лучше новый вопрос задам Это чтобы на мой не отвечать? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 18:33 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Вот этот самый кэш сиквенса НеофитSQL свой на каждую сессию И если подумать в контексте многопользовательской среды, то даже понятно почему. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 18:35 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
кит северных морей НеофитSQL Вы много раз говорили про "документированное поведение", но ссылку на документацию так и не нашли. Вряд ли найдете. 22218292 Признаю ошибку. Я это сообщение от env не заметил. В нем действительно Оракл ясно все объясняет используя термин "юзер", включая невозможность одного юзера увидеть значения полученные другим, а также возможность юзеру продолжать пользоваться последним значением, даже если другой юзер его увеличит. Я гуглил довольно старательно, но вместо "юзер" искал упоминания сессии. Зная, что в среде Оракла иногда "юзер и схема" используются взаимозаменяемо, хочется услышать мнение опытных товарищей: в вышеупомянутом описании работы сиквенсов, было бы правильно использовать слово сессия, или юзер (который с именем и паролем)? Терзают сомнения, потому что я наблюдал эффект в контексте двух сессий, одного юзера. Env, извини дружище. Я не увидел твой текст, глаза искали ссылку. Отвечу на ранее заданный собственный вопрос: кэш для сиквенсов является глобальным, поэтому "запоминание" последнего значения в currval каждой сессии с этим кэшем не связано. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 18:47 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQLглобальный сиквенс - это монотонно увеличивающийся безоткатный счетчик А вот это Ваши фантазии. Никто нигде монотонное увеличение не обещает. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 18:47 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Нерешенным остался вопрос, можно ли подсмотреть какое последнее число было выдано сиквенсом, не в текущей сессии, а глобально. Или подсмотреть какое следующее число выдаст nextval, при этом не увеличивая сиквенс. Эти два вопроса не совсем одно и то же, ответы могут различаться больше чем на 1 при штатной работе системы. Пошерстив интернет и прочитав ответы умных людей, пришел к выводу что эта информация недоступна ни программисту, ни ДБА. Хочешь знать какое будет следующее значение - бери его через nextval, и мирись с инкрементом. Хочешь знать какое было последнее выданное в любой из сессий - никак. По крайней мере, гуру с интернета так считают. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 18:53 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLглобальный сиквенс - это монотонно увеличивающийся безоткатный счетчик А вот это Ваши фантазии. Никто нигде монотонное увеличение не обещает. Я сначала удивился, но теперь думаю что вы или пытаетесь намекнуть на циклы в счетчике (у меня цикл выключен), или возможно забыли определение монотонности последовательности. Например, последовательность натуральных чисел 1,2,3,7,42,314,1000 является монотонно увеличивающейся, потому что каждое следующее значение строго больше предыдущего. А что вы имели в виду? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 19:01 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQLА что вы имели в виду? А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для Ваших нужд последовательности бесполезны чуть менее чем совсем. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 19:08 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL Вот этот самый кэш сиквенса НеофитSQL свой на каждую сессию И если подумать в контексте многопользовательской среды, то даже понятно почему. Кэш действительно глобальный, один на целый сиквенс. Не огорчайтесь, это неочевидно. (и наверное, мне не стоило упоминать сессии вблизи этого вопроса, это могло запутать). К этому выводу можно прийти из опыта, через рассуждения или эксперимент. У меня опыта мало, поэтому я проверил свои рассуждения экспериментом. Действительно, глобальный. В нем лежат (а иногда пропадают бесследно) числа последней блочной аллокации, чтобы из-за каждого +1 на диск не писать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 19:15 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLА что вы имели в виду? А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для Ваших нужд последовательности бесполезны чуть менее чем совсем. ну, строго говоря, есть CREATE SEQUENCE ... ORDER https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm ORDER Specify ORDER to guarantee that sequence numbers are generated in order of request. This clause is useful if you are using the sequence numbers as timestamps. Guaranteeing order is usually not important for sequences used to generate primary keys. в какой ситуации, выполняя запросы вида insert into tab(id, ts) values (seq.nextval, systimestamp), мы получим расхождение в очередности id и ts? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 19:19 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLА что вы имели в виду? А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для Ваших нужд последовательности бесполезны чуть менее чем совсем. Хорошо вы меня успокоили что сиквенс монотонный, но обратили внимание на проблему со вставками его использующие. Я по возможности избегаю многосесионные вставления из-за этих, и подобных вещей, но мне конечно интересно как такое происходит, исключая примеры где кодер намеренно это устраивает. С одной сессией все понятно: если я вставляю несколько строчек сразу, они обработаются в любом порядке. Так устроен не только Оракл, это общий принцип. Если мне важен порядок, я буду вставлять по одной строке. Если интересно, давайте разберем конкретный случай: Есть таблица, сиквенс и "before-insert" триггер. Поскольку в 11.2 еще не было автонумерации строчек, кодер использует триггер и сиквенс чтобы создать уникальные ID для основного ключа. Теперь две сессии (или юзера, или еще две чего-то независимых) вставляют по одной строчке наперегонки: первая A, а вторая - X. Тригер их увидет в каком-то неизвестном заранее порядке, возможно одновременно на многоядерном процессоре - я не знаю. Но исполнение триггера сериализуется на сиквенсе, где вызов nextval послужит механизмом синхронизации для строгой очередности. Допустим мы получили А1-Х2, первая сессия обогнала вторую. Строки были помечены в триггере с намеком на очередность, но строки еще не вставлены. Я понимаю вы говорите что эти строки могут на самом деле вставиться в таблицу в порядке X2-A1, и что существует какой-то дополнительный счетчик операций, который сможет показать что Х2 "физически" вставилась первой, а А1 - второй. Возможно, но это должно влиять на бизнес-логику. Я постулирую что порядок присвоенный в триггере является единственно верным для определения очередности, и всегда отсортирую А1-Х2 исходя из этого. Поэтому невидимая для меня деталь что вставка двух строчек имела какую-либо очередность не должна ни на что повлиять. Как триггер сказал - такая и последовательность. Я даже не знаю как отсортировать в порядке времени вставки. Это возможно? Это используют? Зачем? Вы считаете, есть случаи когда нужно беспокоиться о порядке в которой строчки были вставлены? Я не сумел придумать пример где это было бы полезно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 19:47 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
кит северных морей Dimitry Sibiryakov пропущено... А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для Ваших нужд последовательности бесполезны чуть менее чем совсем. ну, строго говоря, есть CREATE SEQUENCE ... ORDER https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm ORDER Specify ORDER to guarantee that sequence numbers are generated in order of request. This clause is useful if you are using the sequence numbers as timestamps. Guaranteeing order is usually not important for sequences used to generate primary keys. в какой ситуации, выполняя запросы вида insert into tab(id, ts) values (seq.nextval, systimestamp), мы получим расхождение в очередности id и ts? Это в точку. Я помчался посмотреть как у меня - там уже стояло ORDER, но не потому что я предусмотрительный, а потому что скопировал свои сиквенсы из тех что были и исполняли похожую функцию. В моем случае односессионной записи по одной строке это бы не повлияло, а вот в другом месте я мог сделать ошибку. Ну и ну! По умолчанию присваивает уникальные, но не обязательно увеличивающиеся номера? Что так трудно? Тьфу, дочитал, отбой. Это похоже относится только к кластерам, где действительно монотонность стоит дорого. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 20:03 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL... По этой причине, Ораклу пришло много баг репортов, и их отделу техподдержки пришлось писать аж целую объяснительную. https://support.oracle.com/knowledge/Oracle Database Products/2588246_1.html Смотрю в книгу вижу RAC фигу. О чем и говорил Вячеслав. Непонятно только, зачем этот бессознательный поток на форум нести? Освой концепции и вопросов станет на порядок меньше. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 20:20 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Кэш действительно глобальный, один на целый сиквенс. Точнее, sequence cache в SGA глобальный для всех последовательностей, но с позиции выдачи значений также глобальный для одиночного сиквенса. Согласен, затупил. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 20:23 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env НеофитSQL, Держите "загадку". От первого nextval до select currval других сессий не было. Код: 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.
Изученных инструментов должно хватить для "решения". Возможно, вы добавили триггер между первой и последней строкой, но об этом не сказали? Или можно полагать что экран правдиво отражает весь инпут полученный ораклом с начала до конца? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 20:32 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL Или можно полагать что экран правдиво отражает весь инпут полученный ораклом с начала до конца? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 20:36 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
K790 НеофитSQL... По этой причине, Ораклу пришло много баг репортов, и их отделу техподдержки пришлось писать аж целую объяснительную. https://support.oracle.com/knowledge/Oracle Database Products/2588246_1.html Смотрю в книгу вижу RAC фигу. О чем и говорил Вячеслав. Непонятно только, зачем этот бессознательный поток на форум нести? Освой концепции и вопросов станет на порядок меньше. Я вижу, вы второй параграф не осилили, застряли на фиге RAC. Перевожу: "применяется к: Ораклу: версия 7 и позже. Информация в документе применима ко всем платформам" Вы понимаете, почему в документах тех поддержки симптом описывается в одной конфигурации, а ответ захватывает более широкую сферу? Я могу объяснить, это вытекает из правил процесса тех поддержки. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 21:45 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
кит северных морей НеофитSQL Или можно полагать что экран правдиво отражает весь инпут полученный ораклом с начала до конца? Да, поэтому я задал уточняющий вопрос. Подождем, что ответит. Мой спул был без модификаций, но не с начала сессии, чтобы показать эффект состояния БД на одинокую сессию.. Вырезать что-то из середины или править текст это конечно обман. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 21:59 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev это единственный человек для которого так много оказалось интиетивно неправильно понятным, что читать документацию совсем не обязательно я скажу больше. это единственный на моей памяти придурок оригинал на этом форуме, которому неглупые и критически настроенные в обычной ситуации люди уже не первую неделю пытаются хирургически пересадить свои мозги. честно - я в ахфиге. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 23:42 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
проходил мимо... честно - я в ахфиге. Аналогично. Если бы я знал больше об AI (искусственном интеллекте), я бы мог предположить, что наш век заканчивается, и неофиты нас сменяют. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 23:50 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
dmdmdm проходил мимо... честно - я в ахфиге. Аналогично. Если бы я знал больше об AI (искусственном интеллекте), я бы мог предположить, что наш век заканчивается, и неофиты нас сменяют. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 01:23 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
dmdmdm Если бы я знал больше об AI (искусственном интеллекте), я бы мог предположить, что наш век заканчивается, и неофиты нас сменяют. Не, неофит не AI, неофит это китайская комната)) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 02:01 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
НеофитSQL экран правдиво отражает весь инпут полученный ораклом с начала до конца Разумеется нет, т.к. инпут полученный ораклом от других процессов, включая системные экран не отразит. Если же речь про "команды полученные в одной сессии", тогда да. Даже правдивее, чем было у вас, ничего не пропущено. НеофитSQL Возможно, вы добавили триггер Да, воспользовался вашей же казуистикой про "другие сессии" env От первого nextval до select currval других сессий не было. и добавил триггер в другой сессии до первого nextval. Поэтому уточнил, что должно хватить изученных инструментов. Пример показывает, что при использовании общего сиквенса в разных кусках кода последний явный вызов nextval в коде пользователя не обязательно будет совпадать с currval в этой же сессии. Никакого чуда, ожидаемое поведение. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 09:36 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env добавил триггер в другой сессии до первого nextval ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 09:40 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вообще-то именно на 11G был такой неопубликованный баг (Sequence Starts With Value 2 In 11G (Doc ID 1273858.1)) И даже вроде SY его здесь показывал ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 09:59 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
кит северных морей env добавил триггер в другой сессии до первого nextval Была мысль. Но решил, что это не сильно отличается. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 10:01 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Вообще-то именно на 11G был такой неопубликованный баг (Sequence Starts With Value 2 In 11G (Doc ID 1273858.1)) И даже вроде SY его здесь показывал я думаю, что всё проще и сессии одной достаточно (и автора ,кто ищет, тот найдет .. в зеркале) примерно было так: Sequence ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 11:41 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
кит северных морей https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm ORDER Specify ORDER to guarantee that sequence numbers are generated in order of request. This clause is useful if you are using the sequence numbers as timestamps. Guaranteeing order is usually not important for sequences used to generate primary keys. в какой ситуации, выполняя запросы вида insert into tab(id, ts) values (seq.nextval, systimestamp), мы получим расхождение в очередности id и ts? Dimitry Sibiryakov не говорил именно о таком запросе, в общем случае id может быть получено ранее до вставки в таблицу, на таблице может быть триггер на ts, причем триггер может явно поломать даже ваш вариант, кроме того, я не помню чтобы Oracle давал гарантии последовательности и четкой очередности вызова различных функций в запросе, тем более что запрос не один и в разных сессиях, в вашем примере я вижу четыре конкурирующих по времени процесса: получение id и ts в первом запросе и получение id и ts во втором запросе, если Oracle дает гарантию последовательности выполнения получения id1 - ts1 -id2 - ts2, хотелось бы увидеть где это описано. В этой ситуации есть еще нюанс, допустим разные сессии вставляют записи с id - 8, 9, 10; 8 и 10 были подтверждены, в этот момент наш неофит начал некую обработку и считал записи вплоть до последней 10-й, обработал их и думает, что он обработал все записи до 10-й включительно, после этого проходит commit 9-й и ущербная логика программного модуля неофита поломалась. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 14:06 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
graycode, Он живёт в парадигме НеофитSQL В таблицу импорта событий пишет один пользователь, больше никто Предположу, что один пользователь == одна сессия в этой парадигме. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 14:17 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env, Меня больше смущает даже не это, а то что его творчество проходит кодревью ... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 14:36 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
graycode, systimestamp получаем на момент старта оператора для всех строк, потом уже id, ф-ции, триггера и тд и чисто теретически (если не латчить ) , можно получить рассогласование в двух сессиях выполняем insert into tab(id, ts) values (seq.nextval, systimestamp), 1) в первой сессии старт инсерта - вычисляется systimestamp получили напр xxx.001001 2) "прерывание" (переключаемся на вторую сессию) 3) во второй стартует инсерт вычисляется systimestamp получили напр xxx.001005 4) во втрой получаем ИД напр 17, "прерывание" (возвращаемся к обслуживанию инсерта в первой сессии) 5) в первой получаем ИД напр 18 итого, ид не согласованы по времени как на самом деле я не знаю ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 14:45 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
graycode, Судя по предыдущим топикам, "старший товарищ" там уже развёл такой зоопарк, что это неудивительно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 14:48 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
graycode env, Меня больше смущает даже не это, а то что его творчество проходит кодревью ... Это бывает, что непрывного code review нет, или есть "по желанию". А вот то, что "боевая база" - 11.2.0.1.0, и разработка ведется прямо на ней - не смущает? Вот это в моей голове со словом "работа" ни в каком извороте не комбинируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 15:44 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
booby, Про наличие админа никто же не говорил. Бэкапов скорее всего тоже нет и база возможно в noarchivelog. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 15:47 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
booby, С большой долей вероятности лицензий на Oracle у организации нет, деньги на девелоперскую среду не выделяются и вообще деньги не выделяются, поэтому сидит два-три человека с зарплатой сильно ниже рынка и пилят систему на ворованном Oracle без всякой организации процесса разработки. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 16:05 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
graycode booby, С большой долей вероятности лицензий на Oracle у организации нет в Украине позволить себе купить оракле могут лишь немногие https://prozorro.gov.ua/tender/search/?query=oracle .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 16:16 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
Stax graycode booby, С большой долей вероятности лицензий на Oracle у организации нет в Украине позволить себе купить оракле могут лишь немногие https://prozorro.gov.ua/tender/search/?query=oracle .... stax В России так же было, прошло 15 лет, в результате: Oracle DBA/Developer на рынке доступнее чем по другим базам Oracle база сидит на каждом рабочем месте, не говоря о информационных системах. первая доза бесплатна, как только появятся бабки, все резко изменится... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 17:32 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
[quot env#22218733] НеофитSQL Пример показывает, что при использовании общего сиквенса в разных кусках кода последний явный вызов nextval в коде пользователя не обязательно будет совпадать с currval в этой же сессии. Никакого чуда, ожидаемое поведение. ничего удивительного. Для оракла все равно, видит пользователь вызов nextval на экране или нет. Хоть в триггере, хоть в функции. Главное, чтобы в той же сессии. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 20:03 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
graycode В этой ситуации есть еще нюанс, допустим разные сессии вставляют записи с id - 8, 9, 10; 8 и 10 были подтверждены, в этот момент наш неофит начал некую обработку и считал записи вплоть до последней 10-й, обработал их и думает, что он обработал все записи до 10-й включительно, после этого проходит commit 9-й и ущербная логика программного модуля неофита поломалась. Если это джоб периодически проверяющий таблицу (и несколько пишущих в нее сессий), то такое было возможно. Запоздалые коммиты могли бы пропуститься. Пришлось бы отмечать что видел, что не видел, ... лишняя работа. У меня не так. Мой после-триггер видит (и обрабатывает) каждую вставленную строку ровно один раз до коммита. Чем проще дизайн, тем меньше ломается. (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 20:10 |
|
Чтение таблицы из триггера (after-insert)
|
|||
---|---|---|---|
#18+
env graycode, Он живёт в парадигме НеофитSQL В таблицу импорта событий пишет один пользователь, больше никто Предположу, что один пользователь == одна сессия в этой парадигме. Точно. Пользователь тут не важен. Важно что в таблицу пишет ровно одна сессия, которая больше ничего не делает. (но если это важно, пользователь для импорта тоже другой, с ужатыми правами) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 20:14 |
|
|
start [/forum/search_topic.php?author=KudesNIK71&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
83ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
195ms |
get tp. blocked users: |
1ms |
others: | 439ms |
total: | 789ms |
0 / 0 |