Да, всегда плохо делать поведение зависимым от pg_trigger_depth()
Может быть, я немного менее склонен к общим заявлениям, но что хорошего это может сделать? Я не вижу аргумента, почему вы хотели бы такую функцию. Основной целью базы данных является обеспечение целостности данных. И, насколько я понимаю, и я могу ошибаться, такое использование всегда является потенциальным нарушением целостности данных. В ответе @ Эрвина он говорит «если забудешь» . Смысл обеспечения целостности заключается в том, чтобы устранить эту возможность. Если агент может запомнить все и понять последствия и код, связанный с ними, вы можете получить целостность данных из всего .
Давайте введем несколько терминов, в программировании мы имеем
- «состояние», которое включает в себя все, к чему имеет доступ программист.
- «контекст исполнения», который включает среду для исполнения.
Кроме того, у нас есть термин для функции, которая не имеет состояния, которое мы называем чистой функцией ,
Функция всегда оценивает одно и то же значение результата, учитывая одно и то же значение аргумента. Значение результата функции не может зависеть от какой-либо скрытой информации или состояния, которые могут изменяться во время выполнения программы или между различными выполнениями программы, а также не может зависеть от какого-либо внешнего ввода от устройств ввода-вывода (обычно - см. Ниже).
Различие чистоты является полезным , поскольку она исключает нагрузку на память что - либо от имени компьютера или программиста: f(x) = y
это всегда верно. Здесь вы нарушаете чистоту в худшем месте - базе данных. И вы делаете это сложным и подверженным ошибкам способом - делая внутренний контекст выполнения ощутимой вещью в состоянии вашего приложения БД.
Я бы не хотел этого. Просто подумайте о сложностях, которые вы должны мысленно буферизовать.
Table A
«S Trigger A
пожаров
Trigger A
всегда выдает DML Table B
, стреляя Trigger B
.
Trigger B
условно выдает ДМЛ на Table A
стрельбу Trigger A
.
Trigger B
всегда выдает DML Table A
, стреляя Trigger A
.
Trigger A
условно выдает ДМЛ на Table B
стрельбу Trigger B
.
Trigger B
условно выдает ДМЛ на Table A
стрельбу Trigger A
.
Trigger B
всегда выдает DML Table A
, стреляя Trigger A
.
Если это выглядит сложным, имейте в виду, что «условно» можно далее расширить до «это произошло, но это может случиться не всегда» и «это не произошло, но это может произойти в другом месте».
Чтобы pg_trigger_depth()
даже быть полезным, вы должны иметь ряд событий, которые также сложны. И теперь, вы хотите, чтобы выполнение зависело от содержимого выполнения в этой цепочке?
Я бы избежал этого. Если ваша система триггеров такая сложная, вы сами играете в «горячий картофель» с ручной гранатой в шкафу, и это вряд ли закончится хорошо.