powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чтение таблицы из триггера (after-insert)
178 сообщений из 178, показаны все 8 страниц
Чтение таблицы из триггера (after-insert)
    #40009535
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос: как передать значение строки в функцию для обработки?

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE OR REPLACE TRIGGER TR_REACTOR_EVENTS
  after insert on REACTOR_EVENTS -- в таблицу пишутся данные снаружи
  for each row
begin
  PROCESS_REACTOR_EVENT( :new, '-verbose -journal' );
end;



Передача :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.
rnew   REACTOR_EVENTS%ROWTYPE;
..
  rnew.xyz1 := :new.xyz1; -- потому что rnew := :new нельзя
  rnew.xyz2 := :new.xyz2;
...
  PROCESS_REACTOR_EVENT( rnew, '-verbose -journal' );


Все работает, но теперь этот код нужно помнить подправить каждый раз таблица меняется.

Отсюда вопрос: как передать из триггера "после-вставки" значение вставленной строки в функцию обработки?

Функцию обработки я вынес из триггера для юнит-теста, т.к мне нужно прогнать наборы данных через триггер, не внося изменений в промышленную таблицу, в которую у меня даже не должно быть права писать. Функцию я могу вызвать на любом наборе данных, а также передать ей отладочные параметры. Как делать отладку на коде триггеров, я даже не представляю.

Более широкий вопрос: как юнит-тестить и дебагить код внутри триггера? добавление строк в таблицу нежелательно, т.к. приводит к нежелательному изменению состояния системы.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009538
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дает ошибку что таблица все еще мутирует после вставки, читать ее нельзя из триггера.Всё правильно, т.к. этот триггер может быть не единственным на такое событие у таблицы, а порядок срабатывания триггеров на одно событие не определен, поэтому может после него сработать и другой триггер. Т.е. данные в таблице ещё не устаканились и уж тем более не закоммитились.

Передавать попольно, afaik.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009539
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,
0) никогда, ни при каких обстоятельствах, и ни по чьему велению не ставьте натурных экспериментов на боевой системе.

1) нежелательные для вас изменения происходят не после команды insert, а после команды commit, у которой есть парно-обратная - rollback, используйте rollback в экспериментах там, где это необходимо.

2) почитайте и посмотрите любые примеры на составные триггеры, их делали специально и персонально для вас, и они долго ждали своего часа.

3) имеющийся в вашей среде отладчик вполне отладит ваши триггера, если они будут скомпилированы в режиме интерпретации и с включением отладочной информации.

4) если у вас есть возможность избегать использования триггеров - старайтесь избегать. Это определенная дисциплина проектирования, прежде всего.
---------------------
Имхо,
по тому что вы пишете, (мне) ясно, что вы делаете игрушечную систему, рассчитанную на малую нагрузку и общий небольшой объем данных.

Попробуйте далее, когда возникнет желание написать триггер, обязательно представлять себе, что вы подносите голую руку с
горящей в ней спичкой к горке магниевых стружек в смысле эффекта, оказываемого на производительность вставки
(она горит при этом ярким фонтаном огня, жестко обжигая вокруг себя все, включая поджигателя).
Ну, или что вы стеклянную колбу с царской водкой в руках несете, и ваша задача - не споткнуться.

Когда дело дойдет до "настоящих" требований по производительности, примерно также придется относиться и к каждому
создаваемому индексу.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009553
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
booby,

авторКогда дело дойдет до... чтения документации...
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009585
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

Для начала было бы неплохо прочитать документацию про триггеры, какие виды есть, для чего нужны и когда какие срабатывают.

Почему не используете before триггер?

Если вы хотите свои тесты залить на боевую систему, еще раз перечитайте то что вам написал booby.

Касательно функций и прочего PL/SQL, нужно четко понимать SQL - транзакционный, PL/SQL - нет.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009607
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
... нужно четко понимать SQL - транзакционный, PL/SQL - нет.

В такой простой формулировке, это слишком сложное высказывание.

Имхо, выглядит как out of context, в нём недостаточно явных битов информации на количество букв,
и потому, оно, для первого чтения, совершенно бессмысленное. Это шифровка.

Общий контекст восприятия возникает на фоне овладения концептами "транзакция",
"согласованные изменения" и "потеря изменений при конкуренции".
Если нет понимания ничего из этого - умнее и упоминать, всё равно не будет понято, о чём идет речь.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009657
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильный Вася
дает ошибку что таблица все еще мутирует после вставки, читать ее нельзя из триггера.
Всё правильно, т.к. этот триггер может быть не единственным на такое событие у таблицы, а порядок срабатывания триггеров на одно событие не определен, поэтому может после него сработать и другой триггер. Т.е. данные в таблице ещё не устаканились и уж тем более не закоммитились.

Передавать попольно, afaik.

Спасибо за объяснение; я не совсем его понял.
Почему таблица считается мутирующей на чтение в "после" триггере? Я предполагал что раз уж в после-триггере запрещено изменение таблицы, то сама таблица находится в стабильном состоянии. Даже если их несколько, все после-триггеры должны увидеть одну и ту же таблицу, с уже вставленной строкой.

Есть ли логическое обоснование, почему после-триггеру запрещено прочитать из таблицы только что вставленную строку, или это просто ограничение имплементации?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009658
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Много полезных комментариев.

0) согласен, боевая система не должна использоваться для разработок. В моей работе, это правило не применяется.

1) я изучу, можно ли весь код триггера сделать совместимым с откатом. Использование отката для юнит-тестов не приходила мне в голову, т.к. у триггера есть побочные эффекты которые не откатятся.

2) почитаю про составные триггеры, о которых знаю "краем глаза". Я предполагал, что мой вопрос слишком простой для таких конструкций.

(3) понял, не знал

(4) о вреде триггеров. Я понимаю, что они считаются вредными для скорости. Есть другие причины? Этот триггер вызывается раз в минуту, не чаще.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009659
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Вам сейчас нужно больше думать о допустимости и последствиях в вашей конкретной ситуации неоткатываемых действий.

"Другие причины" лежат вокруг того, что вы сознательно вплетаете отключаемые событийные интерфейсы.
Если это было сделано до вас, и вы не вполне понимаете, что это такое - это одна сторона медали.
Если вы делаете это своей рукой, хорошо, чтобы вы абсолютно точно понимали и что это такое, и как вы собираетесь с этим
долго жить в условиях неизвестных вам сегодня будущих потребностей.
И особенно , когда вы на голубом глазу собираетесь в контексте транзакции выполнять неоткатываемые действия.

Вы кого-то заведомо обмануть пытаетесь, или это способ тотальной слежки за мыслями и случайными почёсываниями?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009660
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode

Почему не используете before триггер?
.


Я выбрал после-триггер, т.к. мой код обработки событий не предполагает изменения самого события, те остаются в первоначальном виде. Также, если у таблицы когда-то появится* до-триггер, я хотел чтобы код обработки событий видел окончательное значение события, а не сырое промежуточное.

(*) Уже появился; пришлось повесить до-триггер когда дополнял таблицу событий первичным ключом. До 12.х у оракла не было автоинкремента колонки, пришлось добавить короткий до-триггер с :new.id := sequence.nextval
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009661
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Почему таблица считается мутирующей на чтение в "после" триггере?
Потому что ещё не было коммита .
Не забывай, что другой триггер на это row-событие (или в целом на table-событие) может попытаться что-то сделать, что вызовет exception, а это автоматом отменит транзакцию. Например, в другом триггере будет неудачная попытка каскадных изменений в каких-то зависимых таблицах или сложная проверка целостности данных.

НеофитSQL
все после-триггеры должны увидеть одну и ту же таблицу, с уже вставленной строкой.
Ну так row-триггеры и видят ровно одну свою строку в :NEW.

НеофитSQL
Есть ли логическое обоснование, почему после-триггеру запрещено прочитать из таблицы только что вставленную строку, или это просто ограничение имплементации?
Она ещё НЕ вставленная, она В ПРОЦЕССЕ.
И почитай разницу между блокировочниками и версионниками среди СУБД. Это к вопросу имплементации.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009662
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

О неоткатываемых действиях и прочих "обманах".

Одно известное мне сегодня неоткатываемое действие - запись ошибок исполнения в лог/таблицу ошибок.
Логгинг, по своей природе, не следует отката, и сохраняет сообщения об ошибках кода даже при откатах.
Я не знаю, есть ли код с побочными эффектами кроме лога ошибок, но посмотрю.

Я следую установленной в продукте архитектуре, которая использует триггеры довольно обширно, включая каскадную их разновидность, когда изменение строки в одном представлении выстреливает триггеры в нескольких других. Это выглядело способным вызвать кольцевую зависимость, поэтому я для себя набросал иерархию представлений и таблиц - какие триггеры могут писать в какие таблицы. Все пока легло в дерево, т.е. каждое одиночное изменение должно закончиться в конечное время.

Возможно, уже кто-то написал best practices: как в оракле принято обрабатывать внешние события, и я просто ещё не нашел этот труд. Он мог бы начинаться "избегайте таблиц с триггерами в качестве механизма передачи внешних событий, вместо этого оформите внешние события в виде...."? Сообщений? Запросов? Поллинга внешних таблиц?

Как это принято делать?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009665
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я благодарен вашему терпению. Я наверное задаю новичковые вопросы. С триггерами познакомился буквально два дня назад.

Правильный Вася
НеофитSQL
Почему таблица считается мутирующей на чтение в "после" триггере?
Потому что ещё не было коммита .
Не забывай, что другой триггер на это row-событие (или в целом на table-событие) может попытаться что-то сделать, что вызовет exception, а это автоматом отменит транзакцию. Например, в другом триггере будет неудачная попытка каскадных изменений в каких-то зависимых таблицах или сложная проверка целостности данных.


Я понимаю что до коммита строка в таблице только для сессии, а не глобально. И коммита ещё может не произойти.
Однако, в других ситуациях оракл вполне позволяет мне читать строку для которой ещё не произошел коммит. С точки зрения сессии новая строка уже в таблице, и я могу на ней исполнить селект. Только не даёт это сделать в триггере. Поэтому я спросил. Разве триггер исполняется не в контексте сессии?

[quot Ну так row-триггеры и видят ровно одну свою строку в :NEW.
[/quot]

Я бы этим и пользовался, но у этой псевдопеременной есть ограничения, она не типа rowtype, и ее нельзя передать как параметр.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009667
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
...
Одно известное мне сегодня неоткатываемое действие - запись ошибок исполнения в лог/таблицу ошибок.
Логгинг, по своей природе, не следует отката, и сохраняет сообщения об ошибках кода даже при откатах.

о, боже... "логгинг" - это что, синоним "элегантности"?

Есть "логгинг" и "логгинг".

Если происходит плановый отказ от завершения транзакции - зачем вообще логировать планово несостоявшиеся действия?

Если же фиксируются действия, отвергнутые по наличию ошибок заполнения данных, то это называется не "логгинг",
а "валидация".

Необходимость сохранения её результатов определяется либо потребностями программиста в трассировке на период отладки,
либо конкретными особенностями устройства процедур проверки качества данных.

В обоих случаях это не побочный, а явный результат специально организованного процесса, в общем случае, состоящего из произвольного числа транзакций.

Вы в своих триггерах ифы писать замучаетесь, чтобы понять, какой именно красоты логирование именно сейчас требуется.
У вас вставка в таблицу в таком варианте намертво привязывается к имени процесса, его производящего.
Ну, или будете логировать всё подряд в общую мусорку, и результатом нельзя будет воспользоваться содержательно.
Конечно, много изумительной мути, в триггерах можно наваять.

НеофитSQL
...
Как это принято делать?

А вот как очередной свежепришедший неофит наляпяет, так и приято.
Статистически неотличимая от 100% доля "ынтырпрайза" не является непроходимым гуаном чуть менее, чем целиком.
В том числе и в области "логирования".

Обычно это является печальным результатом блестящего образования, большого опыта работы,
высокой степени самооценки и безграничного доверия руководства.

...
И только очумевшие администраторы изредка постанывают -
"Ау! Есть читатели на эти великолепные логи?
Когда и какой мусор сносить-то можно, к чёртовой матери, или его надо ленту писать?..."
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009668
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сессия и транзакция - суть 2 больших разницы.

Читай уже доку , что ль. Изучать монстров типа Оракл по сообщениям форума - это как по учебнику ботаники пытаться понять работу космического корабля во всех нюансах.

Сначала базовые вещи, потом детали. НЕ наоборот.

У Оракла достаточно документации для РАЗНЫХ уровней подготовки, даже нулячих.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009669
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первую очередь это сделано именно из-за многострочных операторов
Согласованность любого запроса поддерживается на уровне SCN, и строки все будут вставлены/обновлены/удалены тоже на один момент SCN.
А внутри одного оператора (многострочного) получится что на один и тот же SCN, триггер, стрельнувший для каждой строки, будет видеть разный набор данных, что противоречит основным принципам ACID
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009671
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

нет смысла ему абракадаброй говорить.
Читать у него времени нет. Триггера писать надо.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009674
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел правильный ответ:

Таблица мутирует потому что триггер построчный.

Доступ к таблице работает нормально из непострочного после-триггера.

Проблема решена, всем спасибо.

Booby, ваши рассуждения о логгинге слишком упрощены и в данном случае неверны. Я могу посоветовать профильные книги, если вам интересно.
Одно из требований доверия к логгингу - запретить любые изменения прошлых событий, в том числе откат.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009675
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
В первую очередь это сделано именно из-за многострочных операторов
Согласованность любого запроса поддерживается на уровне SCN, и строки все будут вставлены/обновлены/удалены тоже на один момент SCN.
А внутри одного оператора (многострочного) получится что на один и тот же SCN, триггер, стрельнувший для каждой строки, будет видеть разный набор данных, что противоречит основным принципам ACID


Не без труда, но расшифровал. Спасибо.

Строки вставляются группой, а триггер однострочный.

Мои трудности оказались связаны с однострочностью триггера, для которого в общем случае не существует стабильного промежуточного состояния таблицы.
Для одиночного insert существует, но запрещен инженерами оракла.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009676
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
...
Booby, ваши рассуждения о логгинге слишком упрощены и в данном случае неверны....

Спасибо, успокоили. А то я уже волноваться начал даже...
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009682
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Если происходит плановый отказ от завершения транзакции - зачем вообще логировать планово несостоявшиеся действия?
"в автономной транзакции: начато - "Действие"; фиксация", ..., "в автономной транзакции: завершено - "Результат"; фиксация".
Но, да - это скорее аудит, чем протоколирование.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009683
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный Вася
Потому что ещё не было коммита .

[рукалицо]
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009684
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Одно из требований доверия к логгингу - запретить любые изменения прошлых событий, в том числе откат.
К аудиту. Который сильно отличается от протоколирования.

P.S.
И, да - вы всё равно идёте к звёздам не per astra.
Запрет изменения реализуется ограничением доступа к таблице аудита. В концептах это всё тоже изложено. Хотя и не "прямо в лоб для вашего случая".
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009688
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильный Вася
НеофитSQL
Почему таблица считается мутирующей на чтение в "после" триггере?
Потому что ещё не было коммита .


Оказалось, дело было вовсе не в коммите. Блочный после-триггер читает таблицу без проблем. Построчный - не может, т.к. вызывается (иногда) между стабильными состояниями таблицы. Из-за этого "иногда" построчному после-триггеру всегда запрещено обращение к возможно мутирующей таблице.

Я сейчас оценил, что ответ на мой вопрос "почему" требует глубоких знаний, и для всех есть возможность узнать что-то новое.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009689
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov
НеофитSQL
Одно из требований доверия к логгингу - запретить любые изменения прошлых событий, в том числе откат.
К аудиту. Который сильно отличается от протоколирования.

P.S.
И, да - вы всё равно идёте к звёздам не per astra.
Запрет изменения реализуется ограничением доступа к таблице аудита. В концептах это всё тоже изложено. Хотя и не "прямо в лоб для вашего случая".


Для протоколирования действий у меня отдельная таблица, где действительно работает откат. Логично, т.к. не случилось действие - нет протокола о нем.

В логе ошибок у меня "безоткатные" данные, в том числе самодиагностика (asserts в лог) для ловли ошибок в моем коде, или недопустимые состояния, которых не должно быть.
Поскольку мой код автоматизации работает без участия человека, мне очень помогает когда он сам рассказывает что у него болит.

И не стирает свои жалобы, если где-то exception.

А как этот вопрос решают колеры с опытом - просто пишут без ошибок? :)
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009697
Фотография 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.
SQL> select * from t;

        ID N
---------- ----------
         1 One
         2 Two
         3 Three

SQL> CREATE OR REPLACE TRIGGER
  2  t$tri
  3  BEFORE INSERT ON T FOR EACH ROW
  4  begin
  5   dbms_output.put_line('AFTER INSERT '||:new.id);
  6   for r in (select *  from t) loop --чтение из таблицы триггера
  7    dbms_output.put_line(r.id||' '||r.n);
  8   end loop;
  9  end;
 10  /

Trigger created.

SQL> set serveroutput on
SQL> insert into t values(4,'НеофитSQL');
AFTER INSERT 4
1 One
2 Two
3 Three

1 row created.

SQL> select * from t;

        ID N
---------- ----------
         1 One
         2 Two
         3 Three
         4 НеофитSQL

SQL>



так конечно делать нельзя , пример для понимания мутации

разве что как защита от непонятно чего


ps
я не считаю триггера всемирным злом

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009699
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Для протоколирования действий у меня отдельная таблица, где действительно работает откат .


прочитайте об автономных транзакциях,
или пишите в файл (в алерт лог например)

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009803
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyЧитать у него времени нет. Триггера писать надо.

Проблема не в совсем в этом, а в том, что ему лень при вызове процедуры перечислять все
поля из new явно. Это же можно пальцы стереть до самых ягодиц.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009840
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Как это принято делать?

Инкапсулировать логику работы с данными в пакетах.

Dimitry Sibiryakov
Проблема не в совсем в этом, а в том, что ему лень при вызове процедуры перечислять все
поля из new явно. Это же можно пальцы стереть до самых ягодиц.

Думаете, если он научится формировать перечисление полей запросом и узнает, что кроме позиционного указания параметров существует именованное, то проблема исчезнет?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009881
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
НеофитSQL

Для протоколирования действий у меня отдельная таблица, где действительно работает откат .


прочитайте об автономных транзакциях,
или пишите в файл (в алерт лог например)

.....
stax


Спасибо, я так и делаю. Моя процедура LogError() объявлена автономной через прагму, что позволяет ей быть безоткатной.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009896
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Инкапсулировать логику работы с данными в пакетах.
Это я и сделал в начале темы. Возник вопрос: как передать :new в этот пакет, кроме перечисления всех полей?
Динамический SQL для копирования одной строки внутри триггера не рассматривается, это извращение.

Было много рассуждений на все темы, ответа пока нет (я скоро напишу, там две строчки).
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009904
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Под инкапсуляцией логики в пакетах подразумевается управление добавлением/изменением содержимого таблиц через вызов процедур, а не прикручивание пакетов к триггерам. Или у вас в базу может лазить кто угодно и править данные в любой таблице в любое время?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009917
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
SQL> select * from t;

        ID N
---------- ----------
         1 One
         2 Two
         3 Three

SQL> CREATE OR REPLACE TRIGGER
  2  t$tri
  3  BEFORE INSERT ON T FOR EACH ROW
  4  begin
  5   dbms_output.put_line('AFTER INSERT '||:new.id);
  6   for r in (select *  from t) loop --чтение из таблицы триггера
  7    dbms_output.put_line(r.id||' '||r.n);
  8   end loop;
  9  end;
 10  /

Trigger created.

SQL> set serveroutput on
SQL> insert into t values(4,'НеофитSQL');
AFTER INSERT 4
1 One
2 Two
3 Three

1 row created.

SQL> select * from t;

        ID N
---------- ----------
         1 One
         2 Two
         3 Three
         4 НеофитSQL

SQL>



так конечно делать нельзя , пример для понимания мутации

разве что как защита от непонятно чего


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.
SQL> select * from tst;
                                     ID N
--------------------------------------- --------------------------------------------------------------------------------
                                      1 one
                                      2 two
                                      3 three

SQL> insert into tst values(4,'НеофитSQL');
4 НеофитSQL
1 one
2 two
3 three
1 row inserted

SQL> select * from tst;
                                     ID N
--------------------------------------- --------------------------------------------------------------------------------
                                      4 НеофитSQL
                                      1 one
                                      2 two
                                      3 three

SQL> 



Сам триггер:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
create or replace trigger TR_TST_AFTER_INSERT
  after insert on tst  
begin
  for r in (select *  from tst) loop --чтение из таблицы триггера
    dbms_output.put_line(r.id||' '||r.n);
  end loop;  
end TR_TST_AFTER_INSERT;



О мутации говорило сообщение об ошибке, "нельзя потому что мутация". Меня как человека думающего занимал вопрос - а почему, собственно, таблица мутирует, ведь все уже вставлено?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009927
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
почему, собственно, таблица мутирует, ведь все уже вставлено?


Все уже вставлено after insert.

Не все уж вставлено after insert for each row.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009930
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm


Все уже вставлено after insert.



Дополнение. Анализировать "все, что вставлено", можно в рамках транзакции. Т.е. не учитывая действия других сессий. Если, как часто бывает, важна очередность действий, вам уже было разъяснено про блокировки и прочие методы обеспечения очередности.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009938
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
раз уж пошла такая пьянка, гуглите сразу про микрооткаты и statement restart, чтобы не было сюрпризов, когда до update и delete доберетесь.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009942
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
CREATE OR REPLACE TRIGGER TR_REACTOR_EVENTS
  after insert on REACTOR_EVENTS -- в таблицу пишутся данные снаружи
--   for each row 
begin
  for rnew in (select * from INSERTED) -- INSERTED не поддерживается в Оракле
  loop
    PROCESS_REACTOR_EVENT( rnew, '-verbose -journal' );
  end loop;
end;



Поэтому у меня так и не получилось передать :new из триггера в процедуру без копирования индивидуальных колонок.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009943
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLПочему так сделано в Оракле, мне неизвестно.

Ты поймёшь это если попытаешься написать свою собственную СУБД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009944
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, в statement-level триггерах у Оракла похоже (я пока не нашел) вообще нет информации о том, что было вставлено или изменено.
Даже количество вовлеченных строчек неизвестно.
Т.е. блочный триггер на удаление вызывается когда было удалено "0 или более" строк.

а что тогда может "instead of insert" блочный триггер делать? Отметить факт пропажи строчек которые не вставились?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009947
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL


Я поменял одну строчку, и все заработало:

...

ведь все уже вставлено?


не одну строчку, а "тип" триггера

в операторных триггерах нет мутации

не все вставлено
напр вставляете сразу три строки, "все вставлено" поcле вставки третьей строки

так и обходят мутацию, накапливают инфу в строчном, и обрабатывают уровня оператора

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009948
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLПочему так сделано в Оракле, мне неизвестно.

Ты поймёшь это если попытаешься написать свою собственную СУБД.


Возможно, возможно нет. У майкрософта это работает, преграда похоже в голове, а не в принципах СУБД.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009949
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
НеофитSQL


Я поменял одну строчку, и все заработало:

...

ведь все уже вставлено?


не одну строчку, а "тип" триггера

в операторных триггерах нет мутации

не все вставлено
напр вставляете сразу три строки, "все вставлено" поcле вставки третьей строки

так и обходят мутацию, накапливают инфу в строчном, и обрабатывают уровня оператора

.....
stax


Если я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на уровне оператора пройтись по списку?
Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009950
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Кстати, в statement-level триггерах у Оракла похоже (я пока не нашел) вообще нет информации о том, что было вставлено или изменено.
Даже количество вовлеченных строчек неизвестно.
Т.е. блочный триггер на удаление вызывается когда было удалено "0 или более" строк.

а что тогда может "instead of insert" блочный триггер делать? Отметить факт пропажи строчек которые не вставились?


считайте в FOR EACH ROW и используйте в statement-level

ps
"Отметить факт пропажи строчек" - непонятно что пропало
.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009951
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLУ майкрософта это работает, преграда похоже в голове, а не в принципах СУБД.

Да. И мы все знаем чья это голова.

У MS нет триггеров уровня строки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009954
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Это умеет делать MSSQL

Который в отличие от оракла изначально шёл от блокировочной модели, а не от версионной. И в котором есть понятие "грязные чтения".

К тому же, сравнение некорректно как минимум потому, что в mssql нет row level триггеров, о чём явно говорит официальная документация.

авторЗначение FOR или AFTER указывает, что триггер DML срабатывает только после успешного запуска всех операций в инструкции SQL, по которой срабатывает триггер. Кроме того, до запуска триггера должны успешно завершиться все каскадные действия и проверки ограничений , на которые есть ссылки.

НеофитSQL
Запрет существует даже при вставлении одной строки, когда преград нет.

Потому, что row level триггер не знает о существовании других строк. Он срабатывает на действие с конкретной строкой.

А таблицы inserted/deleted, да, полезная штука. Увы, не завезли.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009955
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Если я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на уровне оператора пройтись по списку?
Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр.


можно ид, можно ровиды дело вкуса

зы
насчет :new, смеритесь нет (возможно пока) в оракля new типа "record"

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009957
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLЕсли я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на
уровне оператора пройтись по списку?
Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но
это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр.

Назовите таблицу, в которую будете вставлять вставленные строки, INSERTED и внезапно паззл
сложится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009958
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Даже количество вовлеченных строчек неизвестно

А зачем оно в триггере?

Вне его есть sql%rowcount.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009959
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxнасчет :new, смеритесь нет (возможно пока) в оракля new типа "record"

А параметр процедуры этого типа есть? Я честно не в курсе...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009961
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
НеофитSQL

Если я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на уровне оператора пройтись по списку?
Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр.


можно ид, можно ровиды дело вкуса

зы
насчет :new, смеритесь нет (возможно пока) в оракля new типа "record"

.....
stax


Спасибо, смирился. Посмотрел как другие в интернете с этим справляются - копируют по одной колонке, лучше ничего не придумали.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009962
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Даже количество вовлеченных строчек неизвестно

А зачем оно в триггере?

Вне его есть sql%rowcount.


Зачем в триггере что-то знать про вставляемые данные? :)
На то он и триггер.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009963
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLЕсли я правильно понял, я в строчном могу собрать, к примеру, ID вставленных строчек, а на
уровне оператора пройтись по списку?
Это чтобы обойти отсутствие "INSERTED" псевдотаблицы в Оракле. Да, так наверное можно, но
это уже превращается в тройной прыжок из-за неспособности PL/SQL передать :new как параметр.

Назовите таблицу, в которую будете вставлять вставленные строки, INSERTED и внезапно паззл
сложится.


Очень смешно. Это даст все строки, а не новые.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009965
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> ed
Wrote file afiedt.buf

  1  declare
  2    type TRec is record(empno number(4) ,ename varchar2(10));
  3    v_r TRec;
  4    procedure p (p_rec TRec) is
  5    begin
  6      dbms_output.put_line(v_r.empno||' '||v_r.ename);
  7    end;
  8  begin
  9   v_r.empno:=7839;
 10   v_r.ename:='King';
 11   p(v_r);
 12* end;
SQL> /
7839 King

PL/SQL procedure successfully completed.



.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009966
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже, я царапнул часть, где у Оракла есть недоделки.

ORA-25002: cannot create INSTEAD OF triggers on tables

"Почему?" - "Не положено! Невозможно, несовместимо с теорией множеств и принципам СУБД!"

"А если я оберну эту таблицу в представление, тогда можно?" - "Ну, тогда да".

8-I
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009967
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Dimitry Sibiryakov

пропущено...

Назовите таблицу, в которую будете вставлять вставленные строки, INSERTED и внезапно паззл
сложится.


Очень смешно. Это даст все строки, а не новые.


в строчном триггере вставляете строки в "INSERTED", в операторном обрабатываете

так возможно делать не надо, ето я токо для примера

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009968
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Staxнасчет :new, смеритесь нет (возможно пока) в оракля new типа "record"

А параметр процедуры этого типа есть? Я честно не в курсе...

есть. через определение subtype:
Код: plsql
1.
SubType T_TYPE_FULL_ROW_NAME is RelationName%Rowtype;



PS1
а про составные (compaund) триггеры топикстартер так и не нашел времени почитать.

PS2
мало жести.
Что за скука такая - "логирование из триггера".
Давай почту отправлять, что-ли, в конце-то концов.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009969
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,
ты шипучки сегодня много перепил.
Клоун, ты надоел, сними колпак.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009974
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Похоже, я царапнул часть, где у Оракла есть недоделки.

ORA-25002: cannot create INSTEAD OF triggers on tables

"Почему?" - "Не положено! Невозможно, несовместимо с теорией множеств и принципам СУБД!"

"А если я оберну эту таблицу в представление, тогда можно?" - "Ну, тогда да".

8-I


конешно, напр навесьте обычный триггер на вью

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009976
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

а про составные (compaund) триггеры топикстартер так и не нашел времени почитать.


особенно compaund и мерже

....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009981
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

если ты про глобальные переменные уровня триггера - пакетных переменных вроде ещё никто не отменял.
А так да, баг.
Но это милый, обходимый баг.

instead of триггер и без багов убъёт...
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009986
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
НеофитSQL
пропущено...


Очень смешно. Это даст все строки, а не новые.


в строчном триггере вставляете строки в "INSERTED", в операторном обрабатываете

так возможно делать не надо, ето я токо для примера

.....
stax


Согласен, не надо таблицу заводить, где списак ID хватило бы,

Думаю что есть решение проще, чем через кампаунд триггер собирать ID, потом их обрабатывать:
- в таблице есть ID, который монотонно растет. Если знать максимальный ID до Insert, легко извлекаются все строчки из statement-level триггера.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace trigger TR_TST_AFTER_INSERT
  after insert on tst  
begin
  dbms_output.put_line( 'Statement level trigger' );
  for rnew in (select * from TST t where t.id > MaxIDbeforeInsert order by t.id)
  loop
    dbms_output.put_line( rnew.id ||','|| rnew.n );
  end loop;
end TR_TST_AFTER_INSERT;



MaxIDbeforeInsert - это функция которая научилась подглядывать max(tst.id) до вставки/коммита новых строк при вызове из после-триггера.

Проверил - работает как ожидается.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40009988
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно, решение первоначального вопроса:

БЫЛО:
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE OR REPLACE TRIGGER TR_REACTOR_EVENTS
  after insert on REACTOR_EVENTS -- в таблицу пишутся данные снаружи
  for each row
begin
  PROCESS_REACTOR_EVENT( :new, '-verbose -journal' ); -- не дает передать :new псевдорекорд
end;



СТАЛО:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE TRIGGER TR_REACTOR_EVENTS
  after insert on REACTOR_EVENTS -- в таблицу пишутся данные снаружи
begin
  for r in (select * from REACTOR_EVENTS re where re.id > PriorMaxId)
  loop
    PROCESS_REACTOR_EVENT( r, '-verbose -journal' );
  end loop;
end;
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010000
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Если знать максимальный ID до Insert, легко извлекаются все строчки из statement-level триггера.

Блин, ну кода уже перестанете фантазировать и начнете чтить доку....
Не работает этот "метод" в многопользовательской среде, не-ра-бо-та-ет.
Потому единственный вариант сделать Ваш метод надежным - блокировать таблицу с целью сериализации транзакций.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010004
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
НеофитSQL
Если знать максимальный ID до Insert, легко извлекаются все строчки из statement-level триггера.

Блин, ну кода уже перестанете фантазировать и начнете чтить доку....
Не работает этот "метод" в многопользовательской среде, не-ра-бо-та-ет.
Потому единственный вариант сделать Ваш метод надежным - блокировать таблицу с целью сериализации транзакций.


В таблицу импорта событий пишет один пользователь, больше никто. Единственная операция - insert(1line)/commit, поэтому триггер будет вызываться строго сериализованно.

Я понимаю что в если бы в таблицу событий писали несколько и одновременно, то был бы шанс увидеть некоторые из новых событий повторно. Но это не тот случай, у каждого потока событий своя таблица импорта.

Жаль, что я не знаю другого удобного способа пуш-передачи событий в Оракл, какие-нибудь встроенные уведомления или сообщения были бы в самый раз..
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010008
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLЖаль, что я не знаю другого удобного способа пуш-передачи событий в Оракл, какие-нибудь
встроенные уведомления или сообщения были бы в самый раз..

Тебе уже два раза сказали про Database Change Notification. И я ещё добавлю про Advanced
Queueing и её меньшего брата Publish-Subscribe.

С какого раза до тебя дойдёт, что без чтения документации ты так и будешь тыкаться слепым
кутёнком во все розетки?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010038
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да прикольно же
Чувак думает, что он очень умный и заточил бы все намного лучше, а причина кривых решений всего лишь совместимость с 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.
tst> create table t_neofit as select rownum id, rownum val from dual connect by level <= 3;

Table created.

tst> create trigger t_neofit_trg before update on t_neofit for each row
  2  begin dbms_output.put_line(:new.id||': '||:old.val||' -> '||:new.val);
  3  end;
  4  /

Trigger created.

tst> set serveroutput on

-- в других сессиях производятся действия с этой таблицей

tst> update t_neofit set val=val+10;
1: 1 -> 11
2: 2 -> 12
3: 3 -> 13
1: 1 -> 11
2: 2 -> 12
3: 4 -> 14

3 rows updated.

tst> select * from t_neofit;

        ID        VAL
---------- ----------
         1         11
         2         12
         3         14

tst> 
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010045
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLЖаль, что я не знаю другого удобного способа пуш-передачи событий в Оракл, какие-нибудь
встроенные уведомления или сообщения были бы в самый раз..

Тебе уже два раза сказали про Database Change Notification...


(вздох)
Вы уже два раза вход с выходом перепутали. События идут *в* базу. Сегодня - через таблицу импорта, триггеры срабатывают на появлении новой строки. Удобно, работает, но наверное есть методы лучше если кто-то разбирается.

Поллинг не предлагать :)
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010048
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, "хотя бы бегло ознакомиться что такое Database Change Notification" тоже не предлагать
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010050
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Да прикольно же
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.
tst> create table t_neofit as select rownum id, rownum val from dual connect by level <= 3;

Table created.

tst> create trigger t_neofit_trg before update on t_neofit for each row
  2  begin dbms_output.put_line(:new.id||': '||:old.val||' -> '||:new.val);
  3  end;
  4  /

Trigger created.

tst> set serveroutput on

-- в других сессиях производятся действия с этой таблицей

tst> update t_neofit set val=val+10;
1: 1 -> 11
2: 2 -> 12
3: 3 -> 13
1: 1 -> 11
2: 2 -> 12
3: 4 -> 14

3 rows updated.

tst> select * from t_neofit;

        ID        VAL
---------- ----------
         1         11
         2         12
         3         14

tst> 



Действительно интересно. Сам не догадался, но спасибо Гуглу, теперь понимаю почему триггер вызвался более трех раз:
В таблицу одновременно пишут более одного пользователя. ОК, многопользовательский режим, рестарты, там свои погремушки.

Я специально спроектировал импорт событий с одним писателем, чтобы все было просто и удобно, особенно для меня.

insert 1 line /commit; -- одно событие, пришла новая строка
insert 1 line /commit; -- через минуту еще событие, еще строка
insert 1 line /commit; -- и так много полезных событий, которые надо обработать
...

А в триггере события читаю. Эксепшн обрабатываю, каждый insert/commit успешный.

И теперь уже без некрасивого присваивания столбцов по одному, с чего и начиналась эта тема.

Наверное можно было и посложнее что-то замутить, чтоб было что отлаживать. Чтоб все события из разных источников в одну таблицу ломились из разных сессий, и чтоб обработчик событий тоже туда писал, и обработку ошибок через эксепшн - пусть внешний скрипт ловит. Одновременно чистить таблицу из джоба от старых данных, переставляя строки... :)

Я так жонглировать пока не умею, поэтому сделал просто, уже закончил протестировал и сдал. Впереди другие задачи, непохожие на все предыдущие, и в этот раз хуже чем обработка событий - мой код должен управлять финансовыми расходами и действиями людей, но ТЗ очень сырое. Не хочется обнаруживать ошибки в ТЗ, потратив напрасно тысячи долларов, да и модель "машина говорит человеку что делать дальше" выглядит перевернутой. Так делает амазон, и работники снабжения там несчастны из-за этого.

Сейчас думаю, как вернуть в эту новую задачу человеческое звено.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010052
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Я так понимаю, "хотя бы бегло ознакомиться что такое Database Change Notification" тоже не предлагать


Возможно, я что-то пропустил, когда читал про это. Рассматривал использование этого механизма для уведомления клиентов (терминалы) об изменении в адресной книге на сервере, поэтому запомнил что это уведомление от сервера к клиенту.

Если он может работать в другую сторону, я об этом очевидно не знал. Посмотрев на сетап такого механизма, он в разы более трудоемкий чем stateless insert/commit который я могу исполнить хоть из шелла, хоть из аутлука.

Начинаю думать, что передача низкочастотных сообщений через insert-only таблицы был выбран удачно, возможно оптимально для моих целей. От (пока недолгих) вычислений в импорт-триггере я не в восторге; что именно меня смущает, пока не могу сказать. Может, синхронная привязка к импорту, выглядит неэффективно. Для событий частотой в 0.02 герц должно работать без проблем.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010063
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
чтобы все было просто и удобно, особенно для меня
... и мне вообще покласть с прибором и пробором на тех у кого другие нужды и потребности. Подчёркнуто мною.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010068
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неофит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.
завтра поменяется логика вставки в вашу таблицу, и привет.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010081
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Искренне жаль тех, кому придётся потом это сопровождать. Они не будут знать умозаключений про 0.2 герца, гарантию однопользовательской работы и т.п. Зато будут совершенно искренне материть "умника", влепившего > priorMaxId в триггер, когда наконец докопаются до источника ошибки.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010106
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
env,

Да не будет никто у них это сопровождать... Либо контора окончательно разорится, либо купят нормальный биллинг...
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010195
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей
Неофит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. Попробую.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010198
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть с таким количеством "спасибо, не знал" - рановато изобретать замысловатые схемы?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010199
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL,

Искренне жаль тех, кому придётся потом это сопровождать. Они не будут знать умозаключений про 0.2 герца, гарантию однопользовательской работы и т.п. Зато будут совершенно искренне материть "умника", влепившего > priorMaxId в триггер, когда наконец докопаются до источника ошибки.


Возможно, они удивятся "а что, так можно было, посмотреть из после-триггера на состояние таблицы до триггера?".

Вы, env, знаете как это сделать? ;-)
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010208
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Я не вижу смысла в подобной конструкции, т.к. привык к управлению данными через интерфейсы пакетов и разграничение прав доступа. Для данных загружаемых массово проще иметь идентификатор пачки загрузки и дату вставки и изменения.

Необходимость в ваших конструкциях возникает разве что при бардаке в доступе к данным.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010210
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Кит, я не знал о названии direct load, это используется при backup/restore?

это штатный инструмент высокопроизводительной загрузки в БД больших объемов данных откуда угодно, например из текстовых файлов. я не к тому, что это обязательно ваш сценарий, а к тому, что с триггерами много подводных камней. ограничения, производительность, повторные выполнения, НЕвыполнения, негарантированный порядок выполнения... если вы, как вы говорили в какой-то из своих тем, привыкли работать с кодом, который пишется так, чтобы к нему не возвращаться, то скорее всего решение на триггерах - не ваш выбор.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010211
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
"а что, так можно было, посмотреть из после-триггера на состояние таблицы до триггера?"
только не говорите, что вы сделали это на flashback query
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010216
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей,

Не надо подкидывать ему ещё и это...

кит северных морей
который пишется так, чтобы к нему не возвращаться

Так всё верно, к такому коду возвращаться не захочется. Проще свалить в другое место.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010253
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
НеофитSQL,

Я не вижу смысла в подобной конструкции, т.к. привык к управлению данными через интерфейсы пакетов и разграничение прав доступа. Для данных загружаемых массово проще иметь идентификатор пачки загрузки и дату вставки и изменения.

Необходимость в ваших конструкциях возникает разве что при бардаке в доступе к данным.


судя по всему, он автоматизирует взаимодействие независимох процессов без замены внешних интерфейсов.
отсюда уведомления, очереди и прочая событийность, но такая, чтобы "точки входа" в существующие процессы не менять.

Ясен пень, что триггер поднимается на событие - вот ему и точка взаимодейтвия.
А то, что его взаимолдействие - неуправляемое, с ложными срабатываниями - ему пока до лампады.
И пока просвета не видно.

Вообще, упорства и энергии парню, конечно, не занимать.
Но до применения его в мирных целях пока очень далеко.

Жесть, огонь, пальба и приляпывание косвенности в местах, о которых он случайно прочитал к текущему моменту.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010285
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей
НеофитSQL
"а что, так можно было, посмотреть из после-триггера на состояние таблицы до триггера?"
только не говорите, что вы сделали это на flashback query


Нет конечно, я даже слов таких не знал до сегодняшнего дня. Ооо, прочитал. Это прямо машина времени.

Я использовал свойство функций объявленных как автономная транзакция, которые не видят posted данные, поэтому может доступиться к таблице состоянии до вставки* в после-вставочном триггере.

(*) в моем конкретном случае: для импорта событий всех таблиц, "до вставки" и "последний комммит" это одно и то же, каждая строка импорта сопровождается коммитом, т.к. откаты по событиям не поддерживаются бизнес-логикой.

(**) на всякий случай я удостоверился что механизм импорта автоматически делает построчный коммит, и добавил в триггер код который не позволит вставлять строку если есть некомитнутые. Адын страка - адын камит.

Ибо к действиям на мой код извне я привык относиться с подозрением и бить по рукам если не так, с соответствующей внятно описанной ошибкой.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010287
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL,

Я не вижу смысла в подобной конструкции, т.к. привык к управлению данными через интерфейсы пакетов и разграничение прав доступа. Для данных загружаемых массово проще иметь идентификатор пачки загрузки и дату вставки и изменения.

Необходимость в ваших конструкциях возникает разве что при бардаке в доступе к данным.


"не знаю и не нужно" - позиция для программиста слабая.
знать надо много, больше чем нужно, т.к. незнакомые грабли бьют не хуже знакомых.

Посмотрите, я раскрыл "секрет" в другом сообщении.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010293
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
"не знаю и не нужно" - позиция для программиста слабая.


Да, именно ваши методы слабо знакомого с инструментом - позиция сильная.

Продолжайте. Здесь клоунов любят.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010296
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К слову о неожиданных граблях - вот мои сегодняшние.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> select SQ_TEST.currval from dual;
   CURRVAL
----------
        31

SQL> select SQ_TEST.nextval from dual;
   NEXTVAL
----------
        36

SQL> select dbms_metadata.get_ddl('SEQUENCE', 'SQ_TEST') from dual;
DBMS_METADATA.GET_DDL('SEQUENC
--------------------------------------------------------------------------------
   CREATE SEQUENCE  "NEOPHYTE"."SQ_TEST"  MINVALUE 1 MAXVALUE 9999999999

 



Никогда не пользовался currval, попробовал ради интереса и тут же получил граблями.
Sequence определена с инкрементом 1, у меня прыгнула сразу на 5.

Почитал оракловскую документацию, нашел завуалированый намек на причину такого поведения, хотя прямой текст говорит: возвращает последнее значение. Тут явно не последнее, а прошлогоднее какое-то.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010301
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLНикогда не пользовался ... Почитал ... , нашел завуалированый намек ...

Это все неудивительно.

Удивительно, что вы игнорируете очевидные советы сходить в поиск , почитать документацию, попробовать. А главное - поступить на работу, где старший товарищ вместо форума будет вас направлять.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010303
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm


Да, именно ваши методы слабо знакомого с инструментом - позиция сильная.


Открою секрет моего успеха: я использую в работе только инструменты с которыми хорошо знаком, и после тщательных проверок что мое понимание функции инструмента сочетается с действительностью в рамках моей задачи и метод использования является задокументированым.

Поэтому я на данном этапе моих скромных знаний привожу задачи к самым простым знаменателям, и решаю их в срок и без переделок.
Иногда допускаю промахи, которые мой опытный коллега ловит при код ревью.

А в экспериментах - все что угодно. Отверткой копаю, рулеткой стучу, веревкой режу. Получаю неоценимые подсказки от публики, образовываюсь, получаю удовольствие. Стараюсь не раздражать старейшин форума.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010304
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm
НеофитSQLНикогда не пользовался ... Почитал ... , нашел завуалированый намек ...


Это все неудивительно.

Удивительно, что вы игнорируете очевидные советы сходить в поиск , почитать документацию, попробовать. А главное - поступить на работу, где старший товарищ вместо форума будет вас направлять.

Вы ответили так, как вроде знаете причину пропуска чисел в sequence в моем примере.
В правильном ответе всего три слова, но они не те, которые вы мне предложили гуглить.

Вы знаете, почему currval отстает на 5 (или 10, или 15), а не на 1? Я сегодня узнал.

Между вызовом currval и nextval никто нигде не доступался к этому объекту sq_test.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010315
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
после тщательных проверок
Именно "тщательная проверка" является одним из способов подгонки реальности под собственные представления. Вот такой вот когнитивный парадокс.

P.S.
Нет, я даже не издеваюсь.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010334
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov
Именно "тщательная проверка" является одним из способов подгонки реальности под собственные представления. Вот такой вот когнитивный парадокс.

P.S.
Нет, я даже не издеваюсь.


Извините, но я не понимаю что вы хотите сказать.

Возьмем конкретный пример: у меня были основания думать что используемый в системе (в нескольких местах) метод построчного импорта данных исполняет коммит после каждой строки. Документация намекает что это так, но прямо не говорит. Это для меня желаемое поведение.

Я нашел способ проверить что это действительно так, двумя способами. Убедился что так. (на тестовой БД)
После этого, я добавил проверку в который даст ошибку в явном виде если поведение импорта когда-либо изменится на нежелаемое.
Тогда мой код им (снаружи) скажет "делай коммит после каждой строки в явном виде, иначе не работает".

Таким образом, я максимально сузил вводные данные и значительно упростил логику обработки событий.
Мой code coverage в юнит-тесте выше 90%.

А как вы решаете подобные задачи? Пишете код с максимальной выживаемостью, "на вырост" ?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010337
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
прямой текст говорит: возвращает последнее значение. Тут явно не последнее, а прошлогоднее какое-то.
То ли ещё будет. Поиграйся с величиной кэша у сиквенса.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010391
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Тогда мой код им (снаружи) скажет "делай коммит после каждой строки в явном виде, иначе не работает".

И что произойдёт при увеличении объёма импорта?

НеофитSQL
знать надо много, больше чем нужно

Но это не ваш путь. Явно. Вам удобнее взять один инструмент, показавшийся подходящим, и прикручивать его на изоленту и клей, затыкая дыры ограничениями для внешних вызывающих систем. Вместо того, чтобы задаться вопросом "а как правильно решить эту задачу".
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010392
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Посмотрите, я раскрыл "секрет" в другом сообщении


Можете убедительно доказать, что поведение выбранного вами "секрета" не сменится при обновлении версии, добавлении патча, в многопользовательской среде?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010393
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Отверткой копаю, рулеткой стучу, веревкой режу

Идеальное описание вашего подхода к разработке на стороне бд. Лучше не скажешь.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010399
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Посмотрите, я раскрыл "секрет" в другом сообщении


Можете убедительно доказать, что поведение выбранного вами "секрета" не сменится при обновлении версии, добавлении патча, в многопользовательской среде?


Доказывать? Увольте. Это черным по белому, в документации oracle написано.

Почитайте про Read Committed Isolation Level, многие вопросы отпадут.

Про сиквенс .currval/nextval подсказать, или ещё подумаете, как в единственной активной сессии разрыв появился?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010400
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Тогда мой код им (снаружи) скажет "делай коммит после каждой строки в явном виде, иначе не работает".

И что произойдёт при увеличении объёма импорта?


Получу повышение. Ведь это прибыльные уведомления.
Чем больше, тем лучше.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010401
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Про сиквенс .currval/nextval подсказать, или ещё подумаете, как в единственной активной сессии разрыв появился?
Нука-нука (кстати, это поведение в документации описано)
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010413
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLАдын страка - адын камит.
а это не твой "опытный коллега" в соседней теме решает то, что ты сочинил ?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010415
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Кит, я не знал о названии direct load


в старых версиях "direct load" для insert ... values ... не работал

да и зачем Вам етот direct load, пока-что забейте на него

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010419
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
К слову о неожиданных граблях - вот мои сегодняшние.



недоговариваете (махлюете)
currval нельзя получить где-то не дернув nextval

....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010420
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй
НеофитSQLАдын страка - адын камит.

а это не твой "опытный коллега" в соседней теме решает то, что ты сочинил ?

комит комиту рознь.
Ставлю на то, что в обоих случаях удаленный клиент комитит.

При частоте 0.2 тех проблем не получишь,
но удивление может прибежать, когда кто-нибудь с большими потоками скажет - о яка гарна система, дайте нам такую...
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010513
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Про сиквенс .currval/nextval подсказать

Не осилили сходу прочитать про cache и order? Бывает. Тут таких тем от студентов - пачками.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010518
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но почему-то не озвучивает
Постеснялся что-ли? Вроде не замечено за ним особой стеснительности -- вываливает свои домыслы совершенно свободно
И я почему-то уверен, что в подсказке он выдаст частный случай (alter sequence), хотя в доке описан более общий
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010524
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

у него примерно с частотой 0.2ГЦ палятся номера

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010527
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
НеофитSQL
К слову о неожиданных граблях - вот мои сегодняшние.



недоговариваете (махлюете)
currval нельзя получить где-то не дернув nextval

....
stax


Как это получилось:

В "главной" сессии дернул nextval. получил 31. Сессия осталась живой.

Вторая сессия потянула свой nextval 4 раза: 32,33,34,35, и закрылась.

Дальше - как на экране. Currval дает последнее число, но для сессии.
По незнанию, я ожидал что получу текущее значение сиквенса, его не меняя.
Похоже, такой операции просто нет. Чтобы прочитать глобальный сиквенс, его надо изменить.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010542
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
как в единственной активной сессии

НеофитSQL
Вторая сессия потянула

Да вы, батенька, тот ещё шулер.


упд. Про то, что ваши конструкции развалятся в многопользовательком режиме, вам говорят чуть ли не с первого топика.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010543
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
НеофитSQL
Про сиквенс .currval/nextval подсказать, или ещё подумаете, как в единственной активной сессии разрыв появился?
Нука-нука (кстати, это поведение в документации описано)


Да, это были мои грабли - я подумал что currval позволяет прочитать значение глобального сиквенса. Оказалось - фигвам.
Если хочешь узнать значение - изволь его заодно увеличить. Как прочитать без инкремента - наверное только через dbms функции.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010547
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
как в единственной активной сессии

НеофитSQL
Вторая сессия потянула

Да вы, батенька, тот ещё шулер.


Следите за руками лучше :) Текст фактически корректен.

Все, что было показано на экране - произошло в одной одинокой сессии.
Между вызовами currval и nextval других сессий не было.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010549
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неофит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
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010552
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Между вызовами currval и nextval других сессий не было

Т.е. вы так и не осилили концепцию многопользовательской работы? Именно, что была.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010553
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Stax
пропущено...


недоговариваете (махлюете)
currval нельзя получить где-то не дернув nextval

....
stax


Как это получилось:

В "главной" сессии дернул nextval. получил 31. Сессия осталась живой.

Вторая сессия потянула свой nextval 4 раза: 32,33,34,35, и закрылась.

Дальше - как на экране. Currval дает последнее число, но для сессии.
По незнанию, я ожидал что получу текущее значение сиквенса, его не меняя.
Похоже, такой операции просто нет. Чтобы прочитать глобальный сиквенс, его надо изменить.


Не верю что во Второй сессии
авторCurrval дает последнее число, но для сессии

не дернув nextval Currval не штатно не получить

Код: plsql
1.
2.
3.
4.
5.
SQL> select s.currval from dual;
select s.currval from dual
       *
ERROR at line 1:
ORA-08002: sequence S.CURRVAL is not yet defined in this session



ps
c cash дырки будут
.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010554
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Между вызовами currval и nextval других сессий не было.

А теперь продемонстрируйте, что в вашем понимании "была другая сессия между ... ".
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010557
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Все, что было показано на экране - произошло в одной одинокой сессии.
Между вызовами currval и nextval других сессий не было .


автор Вторая сессия потянула свой nextval 4 раза: 32,33,34,35, и закрылась.


кто-то запутался в двух соснах

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010562
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Но почему-то не озвучивает
Постеснялся что-ли? Вроде не замечено за ним особой стеснительности -- вываливает свои домыслы совершенно свободно
И я почему-то уверен, что в подсказке он выдаст частный случай (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 вместо запоминания числа в переменной, оно не изменится в контексте сессии. Пример в конце страницы по ссылке выше это демонстрирует.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010563
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax
НеофитSQL

Все, что было показано на экране - произошло в одной одинокой сессии.
Между вызовами currval и nextval других сессий не было .


автор Вторая сессия потянула свой nextval 4 раза: 32,33,34,35, и закрылась.


кто-то запутался в двух соснах

.....
stax

Похоже. Вот карта:

вторая сессия отработала до того , что показано на экране.

Все, что было показано на экране - произошло в одной одинокой сессии.
Между вызовами currval и nextval других сессий не было
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010568
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Такое поведение currval для новичка неинтуитивное

С чего бы? Текущее значение, полученное последним этим самым новичком. Очень даже интуитивно.

Но вы продолжайте бессистемно тыкаться носом в частности, не читая концепций. Чудес будет много.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010570
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Между вызовами currval и nextval других сессий не было

Т.е. вы так и не осилили концепцию многопользовательской работы? Именно, что была.


А, вижу что вы так и не поняли пока. Похоже, что не сталкивались.

посмотрите другие ответы, должно проясниться.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010571
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
вторая сессия отработала до того , что показано на экране.

Включая первый вызов nextval?

Заговариваетесь.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010572
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
А, вижу что вы так и не поняли пока

Нет. Это вы упорно живёте в императивном однопоточном мире.

У вас получился классический пример "чудес" многопользовательского режима. Именно из-за непонимания, что вторая сессия была и работала с тем же объектом.

упд. нарисуйте себе на бумажке таймлайны сессий, может так дойдёт
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010573
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Такое поведение currval для новичка неинтуитивное

С чего бы? Текущее значение, полученное последним этим самым новичком. Очень даже интуитивно.

Но вы продолжайте бессистемно тыкаться носом в частности, не читая концепций. Чудес будет много.


О, вы теперь поняли о чем речь. currval возвращает последнее значение nextval для этой сессии .

Вы конечно об этом давно знали, из документации :) Подскажите, где Оракл это описывает? Никак не найду.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010576
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Подскажите, где Оракл это описывает?


Парой сообщений выше цитата.

И на моей памяти вы единственный человек, для которого это оказалось неинтуитивным. За все годы работы с бд в целом и ораклом в частности.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010577
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
env
пропущено...

Т.е. вы так и не осилили концепцию многопользовательской работы? Именно, что была.


А, вижу что вы так и не поняли пока. Похоже, что не сталкивались.

посмотрите другие ответы, должно проясниться.
Я просто не думал, что совершенно стандартное, описаное и понятное интуитивно поведение currval и nextval вызовет какие-то непонятки
Но, как обычно, аффтар не читатель
Думал там действительно что-то из 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. Но ты продолжай -- и мы поразвлекаемся и ты таки что-то новое узнаешь
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010579
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
вторая сессия отработала до того , что показано на экране.

Включая первый вызов nextval?

Заговариваетесь.


Вы наверное спорите о правилах шахмат после каждого проигрыша. Держите марку.

Вот что я представил:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> select SQ_TEST.currval from dual;
   CURRVAL
----------
        31

SQL> select SQ_TEST.nextval from dual;
   NEXTVAL
----------
        36

SQL> select dbms_metadata.get_ddl('SEQUENCE', 'SQ_TEST') from dual;
DBMS_METADATA.GET_DDL('SEQUENC
--------------------------------------------------------------------------------
   CREATE SEQUENCE  "NEOPHYTE"."SQ_TEST"  MINVALUE 1 MAXVALUE 9999999999

 



Я не показал первый nextval (Stax и другие быстро смекнули что он конечно же был),
я только сказал что между currval и nextval (на экране) никаких других сессий не происходило. Это правда.

Это была задачка подумать про контекст, и как такой разрыв мог произойти.
Вячеслав (явно опытный товарищ) выдвинул одну гипотезу, которая вполне могла объяснить наблюдаемый разрыв.
Других предложений я не видел, надеюсь что не пропустил.

Если хотите, я вам лично еще загадок накидаю, полегче.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010580
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это единственный человек для которого так много оказалось интиетивно неправильно понятным, что читать документацию совсем не обязательно

Ну он честно сразу же и сказал, что программировать по документации может каждый слабак не интересно, а у него программирование становится как настоящее искусство... хождение по граблям творческий поиск
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010581
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это тебе еще про кластер (RAC) не рассказали
Там может быть еще интересней
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010583
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Других предложений я не видел

Неудивительно, вы же очень избирательно читаете только то, что укладывается в вашу картину мира.

Вот если вы сможете повторить это в действительно одной сессии, тогда "загадка" будет. А так - документированное поведение в многопользовательском режиме и крючкотворство в игре словами. Является чудом только для тех, кто не читал документацию.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010585
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загадкой, возможно и не будет
Если между операторами прошел достаточный срок
В БД есть и другие процессы/сессии, живущие своей жизнью, которым плевать на твою последовательность, но у них есть свои SQL-операторы, которые могут вытеснить определение твоей последовательности из Library Cache
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010588
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров

Думал там действительно что-то из 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. Но ты продолжай -- и мы поразвлекаемся и ты таки что-то новое узнаешь

Вячеслав, вышеописанные случаи вряд ли применимы здесь. В документе по ссылке выше Оракл описывает случаи когда разрывы происходят из-за жесткой потери чисел сиквенс. Жесткая потеря - это особый случай, когда числя в кэше потерялись, не будучи использованными из-за сбоя, потери питание, и т.д. Появился разрыв, этих чисел никто не видел и не увидит.

В моем примере нет потери чисел, и нет сбоев, все работает штатно.
Все числа сиквенса были успешно получены, все находятся в таблице.
Есть наблюдаемый разрыв внутр сессии, т.к. currval намеренно (и я считаю полезно для программиста)
возвращает текущее значение не глобального объекта, а запомненного последнего значения для этой сессии.

Следствие: две разные сессии которые вызовут currval на одном объекте ВСЕГДА увидят разные числа.
Пока я только пользовался nextval, все эти тонкости мне были незаметны. А когда заметил, углубился потому что мне интересно.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010590
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,
это пока цветочки.
Ягодки проявятся, когда выяснится, что у него на сиквенсах сторонняя логика построена,
типа раз значение меньше, то ясно, что оно раньше, а иначе позже.
Вот это будет - обхохочешься.
И по той уверенности в своих навыках понимания, которые демонстрирует клиент, я почти уверен, что так уже и есть.

:))
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010595
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты просто не осилил, что я сказал

Почему нужно сомневаться что currval вернет тоже значение что и предыдущий nextval, если у него такое предназначение и это описано в доке -- мне трудно понять
Но, наверное, сомневаться -- это здорово, нам некогда работать -- будем сомневаться

PS. А еще не натыкался, что несколько вызовов nextval в одном запросе возвращают одно значение? Вот где разрыв шаблона!
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010598
Фотография 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.
SQL> create table dropme_t(n number);

Table created.

SQL> create sequence dropme_s start with 1 maxvalue 1000 nocache order;

Sequence created.

SQL> insert into dropme_t(n) values(dropme_s.nextval);

1 row created.

SQL> insert into dropme_t(n) values(dropme_s.nextval);

1 row created.

SQL> select * from dropme_t;

         N
----------
         1
         3

SQL> select dropme_s.currval c from dual;

         C
----------
         4



Изученных инструментов должно хватить для "решения".
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010622
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
Ты просто не осилил, что я сказал

Почему нужно сомневаться что currval вернет тоже значение что и предыдущий nextval, если у него такое предназначение и это описано в доке -- мне трудно понять
Но, наверное, сомневаться -- это здорово, нам некогда работать -- будем сомневаться

PS. А еще не натыкался, что несколько вызовов nextval в одном запросе возвращают одно значение? Вот где разрыв шаблона!


Да ну, неужели?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> update test
  2  set id = sq_test.nextval;
15117 rows updated

SQL> set serveroutput on
SQL> exec dbms_output.put_line( 'one:' || sq_test.nextval || ' two:' ||sq_test.nextval);
one:15158 two:15159
PL/SQL procedure successfully completed



Шучу. Я в работе не натыкался, но на неделе видел в документации, оракл об этом очень недвусмысленно говорит.
Вроде еще есть ограничения на внутренние селекты.

> Почему нужно сомневаться что currval вернет тоже значение что и предыдущий nextval
Это потому, что не написано "предыдущий nextval для этой сессии". В многопользовательском режиме это существенное различие, особенно когда в следующей строчке таким же языком описывается nextval независим от сессии.

Возможно это мои тараканы, когда я работал редактором тех документации я обращал внимание на такие мелочи.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010625
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Навык умалчивания контекста и крючкотворства в игре словами с той же поры остался?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010643
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Других предложений я не видел

Неудивительно, вы же очень избирательно читаете только то, что укладывается в вашу картину мира.

Вот если вы сможете повторить это в действительно одной сессии, тогда "загадка" будет. А так - документированное поведение в многопользовательском режиме и крючкотворство в игре словами. Является чудом только для тех, кто не читал документацию.


Вы много раз говорили про "документированное поведение", но ссылку на документацию так и не нашли. Вряд ли найдете.

Думаю, что в официальной документации "currval - в контексте сессии, а nextval - глобальный" так нигде и не упомянуто.

По этой причине, Ораклу пришло много баг репортов, и их отделу техподдержки пришлось писать аж целую объяснительную.

https://support.oracle.com/knowledge/Oracle Database Products/2588246_1.html

Давайте я лучше новый вопрос задам на понимание сиквенс.

Вот этот самый кэш сиквенса (который длиной двадцать по умолчанию, и может повлиять на скорость), он глобальный для БД, или свой на каждую сессию? (этого нет в доках, надо подумать).
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010645
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Такое поведение currval для новичка неинтуитивное, но полезное: можно пользоваться currval вместо запоминания числа в переменной, оно не изменится в контексте сессии. Пример в конце страницы по ссылке выше это демонстрирует.


не забывайте о триггерах

.....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010647
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Вы много раз говорили про "документированное поведение", но ссылку на документацию так и не нашли. Вряд ли найдете.



22218292
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010648
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby
Вячеслав Любомудров,
это пока цветочки.
Ягодки проявятся, когда выяснится, что у него на сиквенсах сторонняя логика построена,
типа раз значение меньше, то ясно, что оно раньше, а иначе позже.
Вот это будет - обхохочешься.
И по той уверенности в своих навыках понимания, которые демонстрирует клиент, я почти уверен, что так уже и есть.

:))


Точно, у меня так и есть: сиквенс используется чтобы установить порядок, в котором импортировались данные через заданный канал.
Поскольку глобальный сиквенс - это монотонно увеличивающийся безоткатный счетчик, это должно надежно работать.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010649
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Давайте я лучше новый вопрос задам

Это чтобы на мой не отвечать?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010651
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Вот этот самый кэш сиквенса

НеофитSQL
свой на каждую сессию

И если подумать в контексте многопользовательской среды, то даже понятно почему.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010656
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей
НеофитSQL
Вы много раз говорили про "документированное поведение", но ссылку на документацию так и не нашли. Вряд ли найдете.



22218292


Признаю ошибку. Я это сообщение от env не заметил. В нем действительно Оракл ясно все объясняет используя термин "юзер", включая невозможность одного юзера увидеть значения полученные другим, а также возможность юзеру продолжать пользоваться последним значением, даже если другой юзер его увеличит.

Я гуглил довольно старательно, но вместо "юзер" искал упоминания сессии.

Зная, что в среде Оракла иногда "юзер и схема" используются взаимозаменяемо, хочется услышать мнение опытных товарищей:
в вышеупомянутом описании работы сиквенсов, было бы правильно использовать слово сессия, или юзер (который с именем и паролем)?

Терзают сомнения, потому что я наблюдал эффект в контексте двух сессий, одного юзера.

Env, извини дружище. Я не увидел твой текст, глаза искали ссылку.

Отвечу на ранее заданный собственный вопрос: кэш для сиквенсов является глобальным, поэтому "запоминание" последнего значения в currval каждой сессии с этим кэшем не связано.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010658
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLглобальный сиквенс - это монотонно увеличивающийся безоткатный счетчик

А вот это Ваши фантазии. Никто нигде монотонное увеличение не обещает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010661
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нерешенным остался вопрос, можно ли подсмотреть какое последнее число было выдано сиквенсом, не в текущей сессии, а глобально.

Или подсмотреть какое следующее число выдаст nextval, при этом не увеличивая сиквенс.

Эти два вопроса не совсем одно и то же, ответы могут различаться больше чем на 1 при штатной работе системы.


Пошерстив интернет и прочитав ответы умных людей, пришел к выводу что эта информация недоступна ни программисту, ни ДБА.

Хочешь знать какое будет следующее значение - бери его через nextval, и мирись с инкрементом.
Хочешь знать какое было последнее выданное в любой из сессий - никак. По крайней мере, гуру с интернета так считают.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010668
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLглобальный сиквенс - это монотонно увеличивающийся безоткатный счетчик

А вот это Ваши фантазии. Никто нигде монотонное увеличение не обещает.


Я сначала удивился, но теперь думаю что вы или пытаетесь намекнуть на циклы в счетчике (у меня цикл выключен), или возможно забыли определение монотонности последовательности.

Например, последовательность натуральных чисел 1,2,3,7,42,314,1000 является монотонно увеличивающейся, потому что каждое следующее значение строго больше предыдущего.

А что вы имели в виду?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010670
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLА что вы имели в виду?

А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в
порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для
Ваших нужд последовательности бесполезны чуть менее чем совсем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010671
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
НеофитSQL
Вот этот самый кэш сиквенса

НеофитSQL
свой на каждую сессию

И если подумать в контексте многопользовательской среды, то даже понятно почему.


Кэш действительно глобальный, один на целый сиквенс.
Не огорчайтесь, это неочевидно. (и наверное, мне не стоило упоминать сессии вблизи этого вопроса, это могло запутать).

К этому выводу можно прийти из опыта, через рассуждения или эксперимент.
У меня опыта мало, поэтому я проверил свои рассуждения экспериментом. Действительно, глобальный.
В нем лежат (а иногда пропадают бесследно) числа последней блочной аллокации, чтобы из-за каждого +1 на диск не писать.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010673
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010679
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

НеофитSQLА что вы имели в виду?

А я имел в виду, что записи, вставленные из разных сессий, а потом отсортированные в
порядке времени вставки, могут показать последовательность 1, 10, 2, 11, 3. Так что для
Ваших нужд последовательности бесполезны чуть менее чем совсем.


Хорошо вы меня успокоили что сиквенс монотонный, но обратили внимание на проблему
со вставками его использующие.

Я по возможности избегаю многосесионные вставления из-за этих, и подобных вещей,
но мне конечно интересно как такое происходит, исключая примеры где кодер намеренно это устраивает.

С одной сессией все понятно: если я вставляю несколько строчек сразу, они обработаются в любом порядке.
Так устроен не только Оракл, это общий принцип. Если мне важен порядок, я буду вставлять по одной строке.

Если интересно, давайте разберем конкретный случай:
Есть таблица, сиквенс и "before-insert" триггер. Поскольку в 11.2 еще не было автонумерации строчек,
кодер использует триггер и сиквенс чтобы создать уникальные ID для основного ключа.

Теперь две сессии (или юзера, или еще две чего-то независимых) вставляют по одной строчке наперегонки:
первая A, а вторая - X.

Тригер их увидет в каком-то неизвестном заранее порядке, возможно одновременно на многоядерном процессоре - я не знаю.
Но исполнение триггера сериализуется на сиквенсе, где вызов nextval послужит механизмом синхронизации для строгой очередности.
Допустим мы получили А1-Х2, первая сессия обогнала вторую. Строки были помечены в триггере с намеком на очередность, но строки еще не вставлены.

Я понимаю вы говорите что эти строки могут на самом деле вставиться в таблицу в порядке X2-A1, и что существует какой-то дополнительный счетчик операций, который сможет показать что Х2 "физически" вставилась первой, а А1 - второй.

Возможно, но это должно влиять на бизнес-логику. Я постулирую что порядок присвоенный в триггере является единственно верным для определения очередности, и всегда отсортирую А1-Х2 исходя из этого. Поэтому невидимая для меня деталь что вставка двух строчек имела какую-либо очередность не должна ни на что повлиять. Как триггер сказал - такая и последовательность.
Я даже не знаю как отсортировать в порядке времени вставки. Это возможно? Это используют? Зачем?

Вы считаете, есть случаи когда нужно беспокоиться о порядке в которой строчки были вставлены? Я не сумел придумать пример где это было бы полезно.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010681
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей
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, но не потому что я предусмотрительный, а потому что скопировал свои сиквенсы из тех что были и исполняли похожую функцию.

В моем случае односессионной записи по одной строке это бы не повлияло, а вот в другом месте я мог сделать ошибку.

Ну и ну! По умолчанию присваивает уникальные, но не обязательно увеличивающиеся номера? Что так трудно?

Тьфу, дочитал, отбой. Это похоже относится только к кластерам, где действительно монотонность стоит дорого.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010683
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL...
По этой причине, Ораклу пришло много баг репортов, и их отделу техподдержки пришлось писать аж целую объяснительную.
https://support.oracle.com/knowledge/Oracle Database Products/2588246_1.html

Смотрю в книгу вижу RAC фигу. О чем и говорил Вячеслав.

Непонятно только, зачем этот бессознательный поток на форум нести? Освой концепции и вопросов станет на порядок меньше.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010685
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Кэш действительно глобальный, один на целый сиквенс.

Точнее, sequence cache в SGA глобальный для всех последовательностей, но с позиции выдачи значений также глобальный для одиночного сиквенса. Согласен, затупил.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010688
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
SQL> create table dropme_t(n number);

Table created.

SQL> create sequence dropme_s start with 1 maxvalue 1000 nocache order;

Sequence created.

SQL> insert into dropme_t(n) values(dropme_s.nextval);

1 row created.

SQL> insert into dropme_t(n) values(dropme_s.nextval);

1 row created.

SQL> select * from dropme_t;

         N
----------
         1
         3

SQL> select dropme_s.currval c from dual;

         C
----------
         4



Изученных инструментов должно хватить для "решения".


Возможно, вы добавили триггер между первой и последней строкой, но об этом не сказали?

Или можно полагать что экран правдиво отражает весь инпут полученный ораклом с начала до конца?
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010689
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Или можно полагать что экран правдиво отражает весь инпут полученный ораклом с начала до конца?
обычно спулы sql plus принято выкладывать как есть, без модификаций.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010696
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
K790
НеофитSQL...
По этой причине, Ораклу пришло много баг репортов, и их отделу техподдержки пришлось писать аж целую объяснительную.
https://support.oracle.com/knowledge/Oracle Database Products/2588246_1.html

Смотрю в книгу вижу RAC фигу. О чем и говорил Вячеслав.

Непонятно только, зачем этот бессознательный поток на форум нести? Освой концепции и вопросов станет на порядок меньше.

Я вижу, вы второй параграф не осилили, застряли на фиге RAC.

Перевожу: "применяется к:
Ораклу: версия 7 и позже. Информация в документе применима ко всем платформам"

Вы понимаете, почему в документах тех поддержки симптом описывается в одной конфигурации, а ответ захватывает более широкую сферу?

Я могу объяснить, это вытекает из правил процесса тех поддержки.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010698
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей
НеофитSQL
Или можно полагать что экран правдиво отражает весь инпут полученный ораклом с начала до конца?
обычно спулы sql plus принято выкладывать как есть, без модификаций.


Да, поэтому я задал уточняющий вопрос.
Подождем, что ответит.

Мой спул был без модификаций, но не с начала сессии, чтобы показать эффект состояния БД на одинокую сессию.. Вырезать что-то из середины или править текст это конечно обман.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010724
проходил мимо...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
это единственный человек для которого так много оказалось интиетивно неправильно понятным, что читать документацию совсем не обязательно

я скажу больше.
это единственный на моей памяти придурок оригинал на этом форуме, которому неглупые и критически настроенные в обычной ситуации люди уже не первую неделю пытаются хирургически пересадить свои мозги.
честно - я в ахфиге.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010725
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходил мимо...
честно - я в ахфиге.


Аналогично.

Если бы я знал больше об AI (искусственном интеллекте), я бы мог предположить, что наш век заканчивается, и неофиты нас сменяют.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010740
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dmdmdm
проходил мимо...
честно - я в ахфиге.


Аналогично.

Если бы я знал больше об AI (искусственном интеллекте), я бы мог предположить, что наш век заканчивается, и неофиты нас сменяют.
слишком плохое мнение об ИИ он бы доку осилил в пару первых секунд...
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010741
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmdmdm
Если бы я знал больше об AI (искусственном интеллекте), я бы мог предположить, что наш век заканчивается, и неофиты нас сменяют.

Не, неофит не AI, неофит это китайская комната))
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010783
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
экран правдиво отражает весь инпут полученный ораклом с начала до конца

Разумеется нет, т.к. инпут полученный ораклом от других процессов, включая системные экран не отразит.
Если же речь про "команды полученные в одной сессии", тогда да. Даже правдивее, чем было у вас, ничего не пропущено.

НеофитSQL
Возможно, вы добавили триггер

Да, воспользовался вашей же казуистикой про "другие сессии"
env
От первого nextval до select currval других сессий не было.

и добавил триггер в другой сессии до первого nextval. Поэтому уточнил, что должно хватить изученных инструментов.

Пример показывает, что при использовании общего сиквенса в разных кусках кода последний явный вызов nextval в коде пользователя не обязательно будет совпадать с currval в этой же сессии. Никакого чуда, ожидаемое поведение.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010784
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
добавил триггер в другой сессии до первого nextval
скучно, я думал на sys.seq$ триггер
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010792
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то именно на 11G был такой неопубликованный баг (Sequence Starts With Value 2 In 11G (Doc ID 1273858.1))
И даже вроде SY его здесь показывал
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010793
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей
env
добавил триггер в другой сессии до первого nextval
скучно, я думал на sys.seq$ триггер


Была мысль. Но решил, что это не сильно отличается.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010821
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров
Вообще-то именно на 11G был такой неопубликованный баг (Sequence Starts With Value 2 In 11G (Doc ID 1273858.1))
И даже вроде SY его здесь показывал

я думаю, что всё проще
и сессии одной достаточно (и автора ,кто ищет, тот найдет .. в зеркале)
примерно было так:
Sequence
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010892
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей
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-й и ущербная логика программного модуля неофита поломалась.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010895
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

Он живёт в парадигме
НеофитSQL
В таблицу импорта событий пишет один пользователь, больше никто

Предположу, что один пользователь == одна сессия в этой парадигме.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010904
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Меня больше смущает даже не это, а то что его творчество проходит кодревью ...
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010907
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010909
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

Судя по предыдущим топикам, "старший товарищ" там уже развёл такой зоопарк, что это неудивительно.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010919
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
env,

Меня больше смущает даже не это, а то что его творчество проходит кодревью ...

Это бывает, что непрывного code review нет, или есть "по желанию".

А вот то, что "боевая база" - 11.2.0.1.0, и разработка ведется прямо на ней - не смущает?
Вот это в моей голове со словом "работа" ни в каком извороте не комбинируется.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010920
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

Про наличие админа никто же не говорил. Бэкапов скорее всего тоже нет и база возможно в noarchivelog.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010928
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

С большой долей вероятности лицензий на Oracle у организации нет, деньги на девелоперскую среду не выделяются и вообще деньги не выделяются, поэтому сидит два-три человека с зарплатой сильно ниже рынка и пилят систему на ворованном Oracle без всякой организации процесса разработки.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010933
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
booby,

С большой долей вероятности лицензий на Oracle у организации нет

в Украине позволить себе купить оракле могут лишь немногие

https://prozorro.gov.ua/tender/search/?query=oracle

....
stax
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40010950
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
graycode
booby,

С большой долей вероятности лицензий на Oracle у организации нет

в Украине позволить себе купить оракле могут лишь немногие

https://prozorro.gov.ua/tender/search/?query=oracle

....
stax


В России так же было, прошло 15 лет, в результате:
Oracle DBA/Developer на рынке доступнее чем по другим базам
Oracle база сидит на каждом рабочем месте, не говоря о информационных системах.

первая доза бесплатна, как только появятся бабки, все резко изменится...
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40011006
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot env#22218733]
НеофитSQL

Пример показывает, что при использовании общего сиквенса в разных кусках кода последний явный вызов nextval в коде пользователя не обязательно будет совпадать с currval в этой же сессии. Никакого чуда, ожидаемое поведение.


ничего удивительного. Для оракла все равно, видит пользователь вызов nextval на экране или нет. Хоть в триггере, хоть в функции. Главное, чтобы в той же сессии.
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40011009
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode

В этой ситуации есть еще нюанс, допустим разные сессии вставляют записи с id - 8, 9, 10; 8 и 10 были подтверждены, в этот момент наш неофит начал некую обработку и считал записи вплоть до последней 10-й, обработал их и думает, что он обработал все записи до 10-й включительно, после этого проходит commit 9-й и ущербная логика программного модуля неофита поломалась.


Если это джоб периодически проверяющий таблицу (и несколько пишущих в нее сессий), то такое было возможно. Запоздалые коммиты могли бы пропуститься. Пришлось бы отмечать что видел, что не видел, ... лишняя работа.

У меня не так. Мой после-триггер видит (и обрабатывает) каждую вставленную строку ровно один раз до коммита.

Чем проще дизайн, тем меньше ломается. (с)
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40011012
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
graycode,

Он живёт в парадигме
НеофитSQL
В таблицу импорта событий пишет один пользователь, больше никто

Предположу, что один пользователь == одна сессия в этой парадигме.


Точно. Пользователь тут не важен. Важно что в таблицу пишет ровно одна сессия, которая больше ничего не делает.
(но если это важно, пользователь для импорта тоже другой, с ужатыми правами)
...
Рейтинг: 0 / 0
Чтение таблицы из триггера (after-insert)
    #40011019
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
У меня не так.

То что ты привык делать все через одно место все уже поняли, не стоит об этом напоминать при каждом удобном случае ...
...
Рейтинг: 0 / 0
178 сообщений из 178, показаны все 8 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Чтение таблицы из триггера (after-insert)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]