powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Бесконечная рекурсия в триггерах.
15 сообщений из 15, страница 1 из 1
Бесконечная рекурсия в триггерах.
    #39803932
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно есть ли лекарство от этого кроме предусмотрительности программиста?
Скажем, указанное в конфиге, ограничение количества вызовов или ещё чего.
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39803948
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergnn,
https://postgrespro.ru/docs/postgresql/11/trigger-definition Если триггерная функция выполняет команды SQL, эти команды могут заново запускать триггеры. Это известно как каскадные триггеры. Прямых ограничений на количество каскадных уровней не существует. Вполне возможно, что каскадные вызовы приведут к рекурсивному срабатыванию одного и того же триггера. Например, в триггере INSERT может выполняться команда, которая добавляет строку в эту же таблицу, тем самым опять вызывая триггер на INSERT. Обязанность программиста не допускать бесконечную рекурсию в таких случаях.
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39804232
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

оно конечно спасибо, но именно это я уже читал.
Просто обычно с СУБД такое не допускается средствами самой БД.
В Оракуле, например из строкового триггера просто невозможно обратиться к таблице этого триггера, а в SYBASE количесто рекурсий ограничивается на уровне конфигурации. Печально что в PG ничего не предусмотрено.
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39804247
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergnn,

А что в Sybase происходит при достижении установленного в конфигурации лимита?
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39804659
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузановsergnn,

А что в Sybase происходит при достижении установленного в конфигурации лимита?

Исключение и откат транзакции.
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39804703
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergnn,

В постгресе также возникнет ошибка и откат оператора, что вызовет откат транзакции.
Только лимит на рекурсию не настраивается.

Но что дает настройка лимита?
С лимитом или без, но триггер написан неправильно и разработчик должен переписать код.
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39804788
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

если откат транзакции происходит, то когда? если не настроено количество рекурсий?
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39804791
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

Понятно что разработчик должен переписать код, но если триггер войдёт в бесконечную рекурсию, то что тогда? Базу перезагружать?
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39804833
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergnnПавел Лузанов,

Понятно что разработчик должен переписать код, но если триггер войдёт в бесконечную рекурсию, то что тогда? Базу перезагружать?
Упрётся в max_stack_depth и прервётся с рядовым ERROR "stack depth limit exceeded". Если настроен неадекватно - то грохнется backend от SIGSEGV и база уйдёт в перезапуск (при включенном restart_after_crash)
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39804968
sergnn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MelkijsergnnПавел Лузанов,

Понятно что разработчик должен переписать код, но если триггер войдёт в бесконечную рекурсию, то что тогда? Базу перезагружать?
Упрётся в max_stack_depth и прервётся с рядовым ERROR "stack depth limit exceeded". Если настроен неадекватно - то грохнется backend от SIGSEGV и база уйдёт в перезапуск (при включенном restart_after_crash)

Круто. По мне так логичнее было бы как-то ограничить количество рекурсий, либо уж как Оракул обрубить обращение к собственной таблице. Но имеем что имеем...
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39805071
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergnn,

Это может происходить только при тестировании разработчиком, но не на боевой базе.
Что хорошего в том, что на боевой базе кривой код (а ведь он кривой) выполнится неправильно "всего" сто раз?
Обрабатывать ошибку и продолжать?
Крайне странно, хотя возможно чего-то не понимаю.
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39805618
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<Взгляд со стороны>
Павел ЛузановЭто может происходить только при тестировании разработчиком, но не на боевой базе.Разработчики не боги и вполне могут чего-то не предусмотреть, что стрелнёт только на проде. Это же не повод пожирать ресурсы и падать с непонятной ошибкой.Павел Лузановхотя возможно чего-то не понимаю.Не дай бог, чтоб разработчик был правильным и писал логи на каждом уровне...

</Взгляд со стороны>
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39805648
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

ары-калоеды, дуйте в свою сракл-песочницу
которая даже рукопашное дерево триггерно не поддержит, при такой странной надобности

https://postgrespro.ru/docs/postgresql/11/runtime-config-resource max_stack_depth (integer)

Задаёт максимальную безопасную глубину стека для исполнителя. В идеале это значение должно равняться предельному размеру стека, ограниченному ядром (как устанавливает команда ulimit -s или равнозначные ей), за вычетом запаса примерно в мегабайт. Этот запас необходим, потому что сервер проверяет глубину стека не в каждой процедуре, а только в потенциально рекурсивных процедурах, например, при вычислении выражений. Значение по умолчанию — два мегабайта (2MB), выбрано с большим запасом, так что риск переполнения стека минимален. Однако, с другой стороны, его может быть недостаточно для выполнения сложных функций. Изменить этот параметр могут только суперпользователи.

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

как видим -- есть ручка для предотвращения. нужно только ознакомиться.

а в других случаях (кроме обслуги графов) -- триггерная рекурсия -- даже не ошибка, а идиотизм разработчика
а сракл я примитивным запросом в ора600 вгонял. синтаксически верным, что интересно.
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39805684
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Обладеть, какие люди! Рад видеть в этом форуме.

Помню в oraclе "грамотные" разработчики уже давно приладились обращаться к мутирующей таблице в автономной транзакции ))
Как по мне, так пусть лучше сервер навернется, но согласованность данных не нарушится.
...
Рейтинг: 0 / 0
Бесконечная рекурсия в триггерах.
    #39806026
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ЛузановРад видеть в этом форуме.Не-не. Я здесь изредка, в попытках увидеть pro. Но пока собираю cons.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Бесконечная рекурсия в триггерах.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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