events - sintaxis - trigger oracle example
Necesito una analogĂa: desencadenantes y eventos (1)
No son lo mismo, pero no están relacionados.
En ambos casos, el mecanismo se puede describir aproximadamente de la siguiente manera:
- Algunos bloques de código declaran "interés" por cambios en el estado.
- Su aplicación afecta algún cambio.
- El sistema ejecuta el bloque de código en respuesta al cambio.
Quizás un desencadenante de base de datos se parece más a una función de devolución de llamada que ha registrado interés en un evento específico.
Aquí hay una analogía: el evento es una pelota de goma que lanzas. El gatillo es un perro que persigue después de una bola arrojada.
Si hay alguna otra diferencia que tenga en mente que lo haga "peligroso" (tenga en cuenta que OP ha modificado esta opción de palabra sin incluir la pregunta) para comparar desencadenantes y eventos, puede describir lo que quiere decir.
Los disparadores son una forma de interponer lógica de repetición sincrónicamente en el hilo de ejecución (es decir, sincronicidad). Los eventos son un medio para diferir la lógica hasta más tarde (es decir, implementar asincronicidad).
De acuerdo, veo lo que quieres decir con más claridad. Pero creo que de alguna manera está sujeto a la implementación. No supondría que un controlador de eventos tiene que darse de baja; depende del sistema que estés usando. Un manejador de señal UNIX, por ejemplo, tiene que evitar atrapar una nueva señal mientras ya está manejando una. Pero un servlet de Java dentro de un contenedor de Tomcat debe ser seguro para subprocesos, ya que varios subprocesos lo pueden llamar simultáneamente. Ambos son controladores de eventos, de diferentes tipos.
Los controladores de eventos pueden ser sincrónicos o asincrónicos. ¿Puede un controlador en un sistema de publicación / suscripción leer los mensajes que se publicaron recientemente, pero antes de que el controlador registre su interés? ¿O solo mensajes publicados al mismo tiempo?
Hay otra razón importante para tratar los desencadenantes como diferentes de los manejadores de eventos: frecuentemente recomiendo no hacer nada en un desencadenante que afecte el estado fuera de la base de datos.
Por ejemplo, enviar un correo electrónico, escribir en un archivo, publicar en un servicio web o realizar un proceso es inapropiado dentro de un desencadenante. Si no es por otra razón que la transacción que generó el desencadenante, se puede revertir, pero no puede revertir esos efectos externos. Puede que ni siquiera esté utilizando transacciones explícitas, pero digamos que envía un correo electrónico ANTES de un desencadenador, pero la operación falla debido a una restricción NOT NULL o algo así.
En su lugar, todo ese trabajo debería hacerse mediante código en la aplicación, después de que uno haya confirmado que la operación SQL fue exitosa y la transacción confirmada.
Es una lástima que la gente siga intentando hacer un trabajo inapropiado dentro de un desencadenante. Hay desarrolladores senior en MySQL que promueven UDF para leer y escribir datos en memcached. Wow, ¡me acabo de dar cuenta de que han llegado al producto MySQL 6.0 ! ¡Chocante!
Así que aquí hay otro intento de analogía, que compara desencadenantes y eventos con el proceso de un juicio criminal:
- ANTES de desencadenar es una acusación.
- Un gatillo DESPUÉS es una acusación.
- COMMIT es una condena después de un veredicto de culpabilidad.
- ROLLBACK es una absolución después de un veredicto inocente.
Usted solo quiere poner al perpetrador en la cárcel después de que sean condenados.
- Mientras que un EVENTO es el crimen mismo.
Por otra pregunta, me estoy encontrando con un concepto erróneo que parece surgir aquí en SO de vez en cuando. Algunos de los que preguntan parecen pensar que los desencadenantes son para las bases de datos, ya que los eventos son para OOP.
¿Alguien tiene una buena analogía para explicar por qué esta es una comparación defectuosa y las consecuencias de aplicarla mal?
EDITAR:Bill K. ha golpeado correctamente, pero tal vez no ve la importancia de la diferencia crítica entre el evento y la función de devolución de llamada que me golpea, de todos modos. Los disparadores hacen que el código se ejecute cada vez que ocurre un evento; las devoluciones de llamada solo ocurren cuando una se ha registrado para un evento (lo cual no es cierto para la gran mayoría de los eventos); e incluso entonces, en la mayoría de los casos, la primera acción de la devolución de llamada es anular el registro (o al menos la devolución de llamada contiene una salida de calificación, por lo que solo se ejecuta una vez).
Si escribe un desencadenador, se ejecutará indefectiblemente cada vez que ocurra el evento, porque no hay forma de registrar o anular el registro en el segmento de código.
Los disparadores son una forma de interponer lógica de repetición sincrónicamente en el hilo de ejecución (es decir, sincronicidad). Los eventos son un medio para diferir la lógica hasta más tarde (es decir, implementar asincronicidad).
Hay excepciones y mitigaciones en ambos casos, pero los patrones básicos de los desencadenantes y las devoluciones de llamada son en su mayoría opuestos en la intención y la implementación. A menudo la distinción no parece haberse hundido por completo. (En mi humilde opinión, YMMV). :RE