Pregunta

He escuchado todo tipo de historias de terror alrededor de gremlins que viven en trigger, y - peor -. Los sistemas de ser derribado por la adición de un disparador que provocó una cadena de conexión en cascada los

Estoy pensando en implementar una política estricta sobre el uso de trigger. Para la separación de las preocupaciones, la idea inicial es decir:

"trigger deberá utilizarse únicamente para el propósito de capturar y mantener la pista de auditoría."

  • ¿Alguien tiene una política similar?
  • ¿Hay argumentos fuertes en contra de la política tal?
¿Fue útil?

Solución

Sonidos como que tienen puntos de vista similares sobre el uso del gatillo, pero estoy muy interesado en escuchar las opiniones opuestas de otros administradores de bases. Personalmente, veo como un último recurso y sólo han implementado disparadores donde no hay otra opción. La excepción es VEZ de disparadores contra vistas.

Los desencadenantes son a menudo la única opción cuando se está mejorando una solución tercera parte y los puntos de extensión no están expuestos por la API de sistemas. Donde tengo acceso completo a la fuente, que no he encontrado todavía una situación en la que un disparador fue mi primer pensamiento.

Auditoría es un ejemplo bueno. En una aplicación de 3 ª parte, los factores desencadenantes pueden ser la única opción. Si usted tiene acceso a una fuente, desde luego, no es la única opción, aunque puede ser opción de menor riesgo / barato / más fácil (borrar según sea el caso). Si la API de base de datos está bien diseñado, habrá otros puntos de entrada para añadir auditoría.

A pesar de mis pensamientos en el gatillo, yo no imponer la estricta política que está sugiriendo. En mi opinión, el DBA vs desarrollador mentalidad que persiste en muchas organizaciones se ha debido a la forma en que este tipo de orientación se percibe. Trata de fomentar la consulta, en lugar de dictar.

Otros consejos

En general, los factores desencadenantes tienen un impacto silencioso y oculto en el rendimiento de modificación de datos.

he visto entornos en los que los errores en cascada fueron causadas por la actualización de otras tablas desde dentro de un gatillo y las tablas actualizadas tenido desencadenantes.

En lo que se refiere a auditting, un disparador puede ser utilizado, pero si usted tiene la edición Enterprise de SQL Server 2008 o posterior, también son capaces de utilizar la funcionalidad de captura de datos modificados (CDC). Gracias a la función CDC elimina la necesidad de añadir un disparador para la mesa auditted y elimina la posibilidad de un impacto en el rendimiento oculto.

Tengo sólo la situación descrita por Mark

Los desencadenantes son a menudo la única opción cuando se está mejorando una solución tercera parte y los puntos de extensión no están expuestos por la API de sistemas.

Mi ejemplo: una aplicación C # escrito por otro desarrollador utilizando LLBL.gen como el ORM. Cualquier cambio en la estructura de datos que desea que el código C # para uso implica la recopilación de toda la estructura de datos y sobreescritura de la .dll anterior.
Era más fácil para agregar lógica de negocio en disparadores llamar a procedimientos almacenados que volver a compilar y probar toda la aplicación. El éxito con los disparadores por lo general implica el "menos es más" adagio. Mantener el uso al mínimo y reemplazarlos con llamadas de la aplicación cuando sea posible. Un beneficio adicional de la aplicación de algunas de lógica de negocio en el lado de la base de datos es no tener que acabar con la aplicación web cuando cambia la lógica.

En los disparadores de Oracle debe evitarse en la mayoría de situaciones porque dividen una parte de la lógica en un área de código separado que es más difícil de depurar y sólo se ejecuta como efecto secundario, no directamente.

excepciones legítimos incluyen en lugar de los factores desencadenantes, la integración con código de terceros, y establecer valores por defecto complejas. Este último puede ser el mayor argumento para utilizar los desencadenantes, pero si la lógica de negocio está en la base de datos, entonces no debería ser necesario.

La lógica de negocio debe estar en paquetes y todos los accesos tabla debe ser hecho a través de los paquetes. El paquete puede aplicar cualquier lógica que se habrían hecho en el gatillo incluidos complejos valores por defecto.

Si tiene que escribir un disparador al menos haga que sea llamar a un procedimiento en el paquete de la lógica de negocio por lo que el código es más intuitivo y fácil de depurar / prueba.

Tom Kyte tiene una diatriba contra los disparadores . Concluyendo con esto:

Los disparadores debe ser la excepción y no la regla. Deben ser utilizados Sólo cuando no se puede hacer algo de otra manera. Dada la concurrencia cuestiones, los problemas con la realización de operaciones no transaccionales en ellos, y los problemas de mantenimiento, factores desencadenantes son algo que se utiliza con moderación, en todo caso.

El argumento rápido y sucio que debe venir en contra de dicha política es la implementación de la lógica de negocio.

auditoría mundanos de tráfico de datos es sólo una buena utilización de los factores desencadenantes.

El mantenimiento de los factores desencadenantes de la lógica de negocio hace que el uso de disparadores adquieren una vida propia, como si fuera parte del ciclo de vida del software. Para algunas bases de datos como Oracle, PostgreSQL y SQL Server, como el uso de disparadores en una arena conforme a ACID nunca debe ser suprimido o relegado si la lógica de negocio se implementa mejor en la base de datos.

Por otro lado, uno de DBMS que tiene problemas con ACID cumplimiento de los disparadores es MySQL. El lenguaje de procedimientos almacenados en MySQL tiene una historia rocosa, aunque se puede lograr una medida del éxito de la aplicación.

El conseguir lejos de cualquier base de datos específica y para mantener las cosas en perspectiva:

Si la integridad referencial se ha de mantener, dejar que el motor de almacenamiento de la base de datos lo hace. ¿Por qué una aplicación reinventar la rueda de la integridad de base de datos como parte de la lógica de negocio? ¿Qué pasa si una transacción (serie de sentencias SQL) necesita ser revertido y los factores desencadenantes ya han disparado en medio de la transacción? ¿Puede la información de auditoría que se ha registrado puede revertir? ¿El motor de almacenamiento permite la reversión de los datos del nivel de disparo? Va a tener que diseñar la reversión cuenta independiente de los paradigmas de SQL estándar? La debida diligencia de la investigación sobre estos temas será aclarar si desencadenantes son una alternativa saludable.

Si hay algunas operaciones aritméticas que se pueden realizar en un disparador que no ralentiza el procesamiento de cada fila de una tabla y, a continuación desencadenantes están bien.

Si hay algo de masaje de datos que tiene que hacer y que preferiría tener un disparador de hacerlo en lugar de en el código del navegador (PHP, Python, Ruby, lo que sea) que no ralentizar el procesamiento de cada fila de una tabla y, a continuación desencadenantes están bien.

Conclusión

En mi humilde opinión usted debe asegurarse de que los registros de auditoría se manejan en las transacciones y no en factores desencadenantes porque cada grabación de una fila provoca la intermitencia de la operación de base de datos, sobre todo cuando se hace un procesamiento a granel o en un sitio web de alto trata. Los disparadores pueden lograr lógica de negocio en muchos (pero no todas) las situaciones.

Todo lo que he aprendido dice "Nunca digas nunca". Siempre habrá casos en los que tienes que ir en contra de cualquier convención establecida y simplemente no hay manera de evitarlo.

Muchas veces parece que estas situaciones son causadas por los sistemas más antiguos, existentes; terceros; y la arquitectura ya en su lugar. Mientras mejores soluciones pueden ser clara y evidente, el tiempo que toma para implementar estas soluciones es mucho más allá del tiempo que tiene disponible para hacer que sucedan (o más allá de los recursos o la autoridad en algunos casos).

Por lo tanto, mi consejo es que - en el mejor - acaba de establecer directrices generales. Tal vez algo como:

"trigger debe pueden usar sólo con el propósito de capturar y el mantenimiento de la pista de auditoría. Se debe tener cuidado para evitar el uso de disparadores cuando sea posible ".

Mi política no es el uso de los disparadores que los datos de modificación. Disparadores que no modifican los datos, pero hacen cumplir las reglas de integridad que no pueden de otra manera pueden hacer con las limitaciones están bien. Los factores desencadenantes son procedimientos equitativos y siempre pueden ser reemplazados por otros procedimientos que no se activan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top