sql >> Base de Datos >  >> RDS >> Oracle

Cómo evitar el error ORA-04091 dentro de un disparador

Podría hacer que el gatillo en A haga algo para alertar al gatillo en B que no necesita disparar. Hay varios deseos de configurar algún estado para una sesión. El enfoque más simple posible sería hacer algo como crear un paquete con una variable booleana bypass_checks_on_b que configuraste en TRUE antes de hacer UPDATE en A, establecer en FALSE una vez que UPDATE se completa, y luego verifique el estado de esta variable en su activador en B antes de realizar sus validaciones. También podría hacer algo similar con una tabla temporal o un contexto en lugar de usar un paquete. De manera menos eficiente, podría analizar la pila de llamadas dentro de su disparador en B para ver si el disparador en A está en la pila de llamadas, pero eso tendería a ser bastante feo.

Sin embargo, sería muy cauteloso con toda esta arquitectura. Cuando descubre que tiene disparadores en A que hacen que se disparen disparadores en B que quisieran consultar A, casi siempre es el caso de que ha puesto demasiada lógica en los disparadores y que sería mucho mejor que se moviera. esa lógica en una capa de procedimiento almacenado que se puede llamar en lugar de que las aplicaciones realicen inserciones o actualizaciones directas. Cuando introduce demasiada lógica en los disparadores, termina con un sistema que es muy difícil de entender porque no es obvio al mirar el código de la aplicación qué tipo de efectos secundarios tienen varias declaraciones. Y termina con un código con mucho estado donde tiene muchas rutas a través de una sola pieza de código dependiendo de la persona que llama. Es casi seguro que eso significa que habrá estados que no pruebe o en los que no pensará en los que descubrirá que su código hace algo inesperado. Entre tener una tonelada de estado y tener una base de código con una tonelada de efectos secundarios, muy rápidamente puede construir una base de código que es esencialmente imposible de mantener.