Да, всегда плохо делать поведение зависимым от 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()даже быть полезным, вы должны иметь ряд событий, которые также сложны. И теперь, вы хотите, чтобы выполнение зависело от содержимого выполнения в этой цепочке?
Я бы избежал этого. Если ваша система триггеров такая сложная, вы сами играете в «горячий картофель» с ручной гранатой в шкафу, и это вряд ли закончится хорошо.