Sí, siempre es malo hacer que el comportamiento dependa de pg_trigger_depth()
Tal vez soy un poco menos reacio a las declaraciones generales, pero ¿qué bien podría hacer? No puedo ver ningún argumento sobre por qué querrías tal característica. El objetivo principal de una base de datos es garantizar la integridad de los datos. Y hasta donde puedo ver, y puedo estar equivocado, tal uso siempre es una violación potencial de la integridad de los datos. En la respuesta de @ Erwin, dice "si te olvidas" . El objetivo de garantizar la integridad es eliminar esa posibilidad. Si un agente puede recordar todo y comprender las consecuencias y el código que lo rodea, puede obtener integridad de los datos de cualquier cosa .
Vamos a introducir algunos términos, en programación, tenemos
- "estado" que incluye cualquier cosa a la que un programador tenga acceso.
- "contexto de ejecución" que incluye el entorno para la ejecución.
Además tenemos un término para una función, que no tiene un estado que llamamos función pura ,
La función siempre evalúa el mismo valor de resultado dados los mismos valores de argumento. El valor del resultado de la función no puede depender de ninguna información oculta o estado que pueda cambiar mientras se ejecuta la ejecución del programa o entre diferentes ejecuciones del programa, ni puede depender de ninguna entrada externa de los dispositivos de E / S (generalmente, ver más abajo).
La distinción por la pureza es útil porque elimina cualquier carga de recordar algo en nombre de la computadora o del programador: siempref(x) = y
es cierto. Aquí estás violando la pureza en el peor lugar: la base de datos. Y lo está haciendo de una manera compleja y propensa a errores, lo que hace que el contexto de ejecución interna sea algo palpable en el estado de su aplicación de base de datos.
No me gustaría eso. Solo considera las complejidades que tienes para amortiguar mentalmente.
Table A
Es por Trigger A
incendios
Trigger A
siempre emite DML para Table B
disparar Trigger B
.
Trigger B
emite condicionalmente DML a Table A
, disparando Trigger A
.
Trigger B
siempre emite DML para Table A
disparar Trigger A
.
Trigger A
emite condicionalmente DML a Table B
, disparando Trigger B
.
Trigger B
emite condicionalmente DML a Table A
, disparando Trigger A
.
Trigger B
siempre emite DML para Table A
disparar Trigger A
.
Si eso parece complejo, tenga en cuenta que "condicionalmente" puede expandirse aún más a "sucedió, pero puede que no siempre suceda" y "no sucedió, pero puede suceder en otros lugares".
Para pg_trigger_depth()
ser incluso útil, debes tener una serie de eventos que sean igualmente complejos. Y, ahora, ¿quieres que la ejecución dependa del contenido de ejecución en esa cadena?
Yo evitaría esto. Si su sistema de activación es tan complejo, está jugando a la papa caliente con una granada de mano en un armario y no parece que termine bien.