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 AEs por Trigger Aincendios
Trigger Asiempre emite DML para Table Bdisparar Trigger B.
Trigger Bemite condicionalmente DML a Table A, disparando Trigger A.
Trigger Bsiempre emite DML para Table Adisparar Trigger A.
Trigger Aemite condicionalmente DML a Table B, disparando Trigger B.
Trigger Bemite condicionalmente DML a Table A, disparando Trigger A.
Trigger Bsiempre emite DML para Table Adisparar 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.