Sim, sempre é ruim tornar o comportamento dependente pg_trigger_depth()
Talvez eu seja um pouco menos avesso a declarações gerais, mas que bem isso poderia fazer? Não há argumento que possa entender por que você desejaria esse recurso. O principal objetivo de um banco de dados é garantir a integridade dos dados. E até onde posso ver, e posso estar errado, esse uso sempre é uma violação potencial da integridade dos dados. Na resposta de @ Erwin, ele diz "se você esquecer" . O objetivo de garantir a integridade é eliminar essa possibilidade. Se um agente pode se lembrar de tudo e entender as conseqüências e o código ao seu redor, você pode obter a integridade dos dados de qualquer coisa .
Vamos introduzir alguns termos, na programação, temos
- "state" que inclui qualquer coisa a que um programador tenha acesso.
- "contexto de execução", que inclui o ambiente para execução.
Além disso, temos um termo para uma função, que não possui um estado que chamamos de função pura ,
A função sempre avalia o mesmo valor de resultado, dados os mesmos valores de argumento. O valor do resultado da função não pode depender de nenhuma informação ou estado oculto que possa ser alterado durante a execução do programa ou entre diferentes execuções do programa, nem de nenhuma entrada externa de dispositivos de E / S (normalmente - veja abaixo).
A distinção de pureza é útil porque elimina qualquer ônus de lembrar qualquer coisa em nome do computador ou do programador: sempref(x) = y
é verdade. Aqui você está violando a pureza no pior lugar - o banco de dados. E você está fazendo isso de uma maneira complexa e propensa a erros - tornando o contexto de execução interna algo palpável no estado do seu aplicativo de banco de dados.
Eu não iria querer isso. Apenas considere as complexidades que você precisa para amortecer mentalmente.
Table A
é Trigger A
incêndios
Trigger A
sempre emite DML para Table B
, disparando Trigger B
.
Trigger B
condicionalmente emite DML para Table A
, disparando Trigger A
.
Trigger B
sempre emite DML para Table A
, disparando Trigger A
.
Trigger A
condicionalmente emite DML para Table B
, disparando Trigger B
.
Trigger B
condicionalmente emite DML para Table A
, disparando Trigger A
.
Trigger B
sempre emite DML para Table A
, disparando Trigger A
.
Se isso parecer complexo, lembre-se de que "condicionalmente" pode ser expandido para "aconteceu, mas nem sempre pode acontecer" e "não aconteceu, mas pode acontecer em outro lugar".
Para pg_trigger_depth()
ser útil, você precisa ter uma série de eventos igualmente complexos. E agora, você deseja que a execução dependa do conteúdo de execução nessa cadeia?
Eu evitaria isso. Se o seu sistema de gatilho é complexo, você está jogando batata quente com uma granada de mão em um armário sozinho e não parece provável que termine bem.